ある変数が保持しているデータ型を知るにはどうすればよいですか?(例:int、string、charなど)
私は今このようなものを持っています:
private static void Main()
{
var someone = new Person();
Console.WriteLine(someone.Name.typeOf());
}
public class Person
{
public int Name { get; set; }
}
他の回答はこの質問に役立つものですが、重要で微妙な問題があり、それらのいずれも直接対処していません。C#で型を検討する方法には、静的型と実行時型の2つがあります。
静的型は、ソースコード内の変数の型です。したがって、これはコンパイル時の概念です。これは、開発環境で変数またはプロパティにカーソルを合わせたときにツールチップに表示されるタイプです。
実行時型は、メモリ内のオブジェクトの型です。したがって、これは実行時の概念です。GetType()
これは、メソッドによって返されるタイプです。
オブジェクトの実行時型は、それを保持または返す変数、プロパティ、またはメソッドの静的型とは異なることがよくあります。たとえば、次のようなコードを作成できます。
object o = "Some string";
変数の静的型はですがobject
、実行時の変数の指示対象の型はですstring
。したがって、次の行は「System.String」をコンソールに出力します。
Console.WriteLine(o.GetType()); // prints System.String
o
ただし、開発環境で変数にカーソルを合わせると、タイプSystem.Object
(または同等のobject
キーワード)が表示されます。
、、など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");
その非常にシンプル
variable.GetType().Name
変数のデータ型を返します
一般的に言って、リフレクションやインターフェースを使って何かをしているのでない限り、タイプ比較を行う必要はほとんどありません。それにもかかわらず:
比較するタイプがわかっている場合は、is
またはas
演算子を使用します。
if( unknownObject is TypeIKnow ) { // run code here
as
演算子は、例外ではなく失敗した場合にnullを返すキャストを実行します。
TypeIKnow typed = unknownObject as TypeIKnow;
タイプがわからず、実行時タイプ情報が必要な場合は、.GetType()メソッドを使用します。
Type typeInformation = unknownObject.GetType();
新しいバージョンのC#では、is
演算子を使用して、以下を使用せずに変数を宣言できas
ます。
if( unknownObject is TypeIKnow knownObject ) {
knownObject.SomeMember();
}
以前は、これを行う必要がありました。
TypeIKnow knownObject;
if( (knownObject = unknownObject as TypeIKnow) != null ) {
knownObject.SomeMember();
}
興味のあるメンバーにカーソルを合わせると、ツールチップが表示されます。メンバーのタイプが表示されます。
GetType()メソッドを使用します
http://msdn.microsoft.com/en-us/library/system.object.gettype.aspx
1つのオプションは、次のようなヘルパー拡張メソッドを使用することです。
public static class MyExtensions
{
public static System.Type Type<T>(this T v) => typeof(T);
}
var i = 0;
console.WriteLine(i.Type().FullName);
GetType()
方法
int n = 34;
Console.WriteLine(n.GetType());
string name = "Smome";
Console.WriteLine(name.GetType());
メソッドを使用してくださいObject.GetType
、これは仕事をします。
変数のタイプを知りたいだけの場合:
var test = (byte)1;
Console.WriteLine(test.GetType());
これを行う簡単な方法の1つをチェックしてください
//コンソールから文字列を読み取ります
string line = Console.ReadLine();
int valueInt;
float valueFloat;
if (int.TryParse(line, out valueInt)) // Try to parse the string as an integer
Console.Write("This input is of type Integer.");
else if (float.TryParse(line, out valueFloat))
Console.Write("This input is of type Float.");
else
Console.WriteLine("This input is of type string.");