C# で変数のデータ型を取得するにはどうすればいいですか? 質問する

C# で変数のデータ型を取得するにはどうすればいいですか? 質問する

変数が保持しているデータ型を調べるにはどうすればよいですか? (例: int、string、char など)

今はこんな感じです:

private static void Main()
{
   var someone = new Person();
   Console.WriteLine(someone.Name.typeOf());
}

public class Person
{
    public int Name { get; set; }
}

ベストアンサー1

他の回答もこの質問に対する良いヒントを提供していますが、どれも直接対処していない重要な微妙な問題があります。C# で型を考慮する方法は 2 つあります。静的型そして実行時タイプ

静的型は、ソース コード内の変数の型です。したがって、これはコンパイル時の概念です。これは、開発環境で変数またはプロパティにマウスを移動したときにツールヒントに表示される型です。

実行時型は、メモリ内のオブジェクトの型です。したがって、これは実行時の概念です。これは、メソッドによって返される型ですGetType()

オブジェクトの実行時の型は、そのオブジェクトを保持または返す変数、プロパティ、またはメソッドの静的型とは異なる場合があります。たとえば、次のようなコードになります。

object o = "Some string";

変数の静的型は ですobjectが、実行時には変数の型は指示対象ですstring。したがって、次の行はコンソールに「System.String」を出力します。

Console.WriteLine(o.GetType()); // prints System.String

ただし、開発環境で変数にマウスを移動すると、その型(または同等のキーワード)oが表示されます。System.Objectobject

int、、doubleなどの値型変数の場合System.Guid、値型は別の型の基本クラスとして機能することはできないため、実行時の型は常に静的型と同じになります。値型は、継承チェーン内で最も派生した型であることが保証されます。これは、シール参照型にも当てはまります。静的型がシール参照型の場合、実行時の値はその型のインスタンスか、のいずれかである必要がありますnull

逆に、変数の静的型が抽象型である場合、静的型と実行時型が異なることが保証されます。

これをコードで説明すると次のようになります。

// int is a value type
int i = 0;
// Prints True for any value of i
Console.WriteLine(i.GetType() == typeof(int));

// string is a sealed reference type
string s = "Foo";
// Prints True for any value of s
Console.WriteLine(s == null || s.GetType() == typeof(string));

// object is an unsealed reference type
object o = new FileInfo("C:\\f.txt");
// Prints False, but could be true for some values of o
Console.WriteLine(o == null || o.GetType() == typeof(object));

// FileSystemInfo is an abstract type
FileSystemInfo fsi = new DirectoryInfo("C:\\");
// Prints False for all non-null values of fsi
Console.WriteLine(fsi == null || fsi.GetType() == typeof(FileSystemInfo));

別のユーザーがこの回答を編集して、以下のコメントに記載されている関数を組み込みました。これは、実行時に型推論を使用して変数の静的型への参照を取得する汎用ヘルパー メソッドですtypeof

Type GetStaticType<T>(T x) => typeof(T);

上記の例ではこの関数を使用できます。

Console.WriteLine(GetStaticType(o)); // prints System.Object

しかし、この関数は、リファクタリングから身を守りたいのでなければ、あまり役に立ちません。 の呼び出しを書いているときGetStaticType、oの静的型がオブジェクトであることはすでにわかっています。次のように書くこともできます。

Console.WriteLine(typeof(object)); // also prints System.Object!

これは私が現在の仕事を始めたときに遭遇したコードを思い出させます。

SomeMethod("".GetType().Name);

の代わりに

SomeMethod("String");

おすすめ記事