web-dev-qa-db-ja.com

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

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

私は今このようなものを持っています:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Testing
{
    class Program
    {
        static void Main()
        {
            Person someone = new Person();
            someone.setName(22);
            int n = someone.getName();
            Console.WriteLine(n.typeOf());
        }
    }

    class Person
    {
        public int name;

        public void setName(int name)
        {
            this.name = name;
        }

        public int getName()
        {
            return this.name;
        }
    }
}
78
Limeni

この質問には他の回答も役立ちますが、重要な微妙な問題があり、どれも直接対処していません。 C#で型を考慮する方法は2つあります:静的型実行時型

静的型は、ソースコード内の変数の型です。したがって、これはコンパイル時の概念です。これは、開発環境で変数またはプロパティにカーソルを合わせたときにツールチップに表示されるタイプです。

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

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

object o = "Some string";

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

Console.WriteLine(o.GetType());

ただし、開発環境で変数oにカーソルを合わせると、タイプSystem.Object(または同等のobjectキーワード)が表示されます。

intdoubleSystem.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));
103
phoog

一般的に言えば、リフレクションやインターフェイスを使用して何かをしているのでなければ、型比較を行う必要はほとんどありません。それにもかかわらず:

比較するタイプがわかっている場合は、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();
}
16
Dai

その非常にシンプルな

variable.GetType().Name

変数のデータ型を返します

11
Sagar Chavan
4

興味のあるメンバーにカーソルを合わせると、ツールチップが表示されます。メンバーのタイプが表示されます。

enter image description here

4

1つのオプションは、次のようなヘルパー拡張メソッドを使用することです。

public static class MyExtensions
{
    public static System.Type Type<T>(this T v)=>typeof(T);
}

var i=0;
console.WriteLine(i.Type().FullName);
1
Acerby

PHPとC#は構文的には関連していますが、まったく異なりますが、質問には額面で答えることができます(この記事を参照してください http://msdn.Microsoft.com/en-us/library/58918ffs(v = vs.71 ).aspx )Jeffrey RichterによるC#(第3版または第2版)を介してCLRのコピーを入手して読むことを強くお勧めします。プログラミングに関連した最高の本で、これまで読んだことがあると思いますが、ほとんどすべてのタイプ関連の質問に答え、フードの下で何が起こっているのかを非常に深く理解するでしょう!

1
bUKaneer

GetType()メソッド

int n=34;
Console.WriteLine(n.GetType());
string name="Smome";
Console.WriteLine(name.GetType());
1
Shyju

これを行う簡単な方法の1つをチェックしてください

// Read string from console
        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.");
        }
0
KiranSolkar