Base
クラスの変数が渡された場合は「Base」を返し、宣言された場合は「Derived」Derived
などを返す関数が必要です。割り当てられた値の実行時のタイプには依存しません。
3 に答える
たとえば、以下のコードを参照してください。重要なのはジェネリックスを使用することです。拡張メソッドは、優れた構文のためだけに使用されました。
using System;
static class Program
{
public static Type GetDeclaredType<T>(this T obj)
{
return typeof(T);
}
// Demonstrate how GetDeclaredType works
static void Main(string[] args)
{
ICollection iCollection = new List<string>();
IEnumerable iEnumerable = new List<string>();
IList<string> iList = new List<string>();
List<string> list = null;
Type[] types = new Type[]{
iCollection.GetDeclaredType(),
iEnumerable.GetDeclaredType(),
iList.GetDeclaredType(),
list.GetDeclaredType()
};
foreach (Type t in types)
Console.WriteLine(t.Name);
}
}
結果:
ICollection
IEnumerable
IList`1
List`1
編集:すべてのIntelliSenseドロップダウンリスト に表示されるため、ここで拡張メソッドを使用しないようにすることもできます。別の例を参照してください。
using System;
using System.Collections;
static class Program
{
public static Type GetDeclaredType<T>(T obj)
{
return typeof(T);
}
static void Main(string[] args)
{
ICollection iCollection = new List<string>();
IEnumerable iEnumerable = new List<string>();
Type[] types = new Type[]{
GetDeclaredType(iCollection),
GetDeclaredType(iEnumerable)
};
foreach (Type t in types)
Console.WriteLine(t.Name);
}
}
また、正しい結果が得られます。
これは、問題のコードを解析しないと不可能です。
実行時には、2つの型情報のみが使用可能です。値の実際の型(object.GetType()を介して)と、問題の変数がパラメーターまたはクラス/インスタンス変数である場合は、FieldInfoのFieldTypeプロパティ、 ParameterInfoのPropertyInfoまたはParameterType。
あなたに渡された値は、あなたへのルート上でいくつかの変数を介してもたらされた可能性があるため、質問は明確に定義されていません。
ああ-メソッドで現在定義されているタイプのみが必要なようですが、式機能はこれを提供します(ローマの答えはこれを行うための適切な方法を示しています)が、メソッドの外でこれを使用しようとすると注意してください...本質的にはコンパイラの一般的な型推論は問題の型を推論しますが、これは、使用される変数が常に表示できる変数であるとは限らないことを意味します。代わりに、コンパイラで合成された変数の場合があります。次に例を示します。
string x = "x";
Console.WriteLine(x.GetDeclaredType()); // string
Console.WriteLine(((object)x).GetDeclaredType()); // object
コンパイラは、xへのオブジェクト参照を配置する一時変数を合成するためです。
オブジェクトにヒットするまで、GetType()を繰り返します。