2012-04-05 24 views
2

IListまたはListを所有しているとします。それはリスト、またはIListであることをどのようにして解決しますか?試行錯誤に頼ることなくこれを行うことができますか?汎用宣言型の認識方法

タイプの名前はList`1のような傾向があります。文字列のハックを考えるのは妥当ですか?

class Program { 

    public class Class1 { 
     public int a { get; set; } 

     public IList<int> list { get; set; } 


     public List<int> concreteList { get; set; } 
    } 

    static void Main(string[] args) 
    { 
     Test1(); 
     Test2(); 
    } 

    private static void Test1() 
    { 
     var t = typeof (Class1); 
     var p = t.GetProperty("list"); 

     if (p.PropertyType.IsInterface && p.PropertyType.IsGenericType) 
     { 
      var ps = p.PropertyType.GetGenericArguments(); 
      var underlying = p.PropertyType.GetInterface("IList"); 

      var b = underlying == typeof (IList<>); 

     } 
    } 

    private static void Test2() { 
     var t = typeof(Class1); 
     var p = t.GetProperty("concreteList"); 

     if (!p.PropertyType.IsInterface && p.PropertyType.IsGenericType) { 
      var ps = p.PropertyType.GetGenericArguments(); 

      var underlying3 = p.PropertyType.GetGenericTypeDefinition(); 

      var b = underlying3 == typeof (List<>); 
     } 
    } 
} 

答えて

5

を。あなたが財産を起動せずに、それを知りたい場合は、その後、あなたのコードはほとんどあり - 例えば、

var t = p.PropertyType; 
if (t.IsGenericType && !t.IsGenericTypeDefinition && !t.IsInterface && !t.IsValueType) 
{ 
    // we are dealing with closed generic classes 
    var typeToTest = typeof (List<>); 
    var tToCheck = t.GetGenericTypeDefinition(); 
    while (tToCheck != typeof(object)) 
    { 
     if (tToCheck == typeToTest) 
     { 
     // the given type is indeed derived from List<T> 
     break; 
     } 
     tToCheck = toCheck.BaseType; 
    } 
} 

IsGenericTypeはタイプがジェネリックであることを示している - (List<int>)オープン(List<T>)または閉じることができます。 IsGenericTypeDefinitionは、汎用タイプがオープンタイプかどうかを示します。 GetGenericTypeDefinitionは、クローズド/オープンジェネリック型の場合、ジェネリック定義(つまりオープンジェネリック型)を返します。

+0

が動作します。私が答えを受け入れる前に、この "List'1" .Split( ''')[0]を行うための基本型を総称的に決定する唯一の方法は?あなたがList :: 1ではなくAFAIKのようなジェネリック型、すなわち 'List'のフレンドリーな名前を知りたければ、文字列の操作は、文字列の操作であるGetGenericTypeDefinition().GetGenericTypeDefinition()。Name.Split( ''')[0] – sgtz

+0

@sgtz行く! – VinayC

2

だけisキーワードを使用します。あなたはそのタイプをテストすることは非常に単純であることができ、プロパティの値を得ることができる場合(Guffaの回答を参照してください)

IList<int> list = ...get a collection from somewhere 

if (list is List<int>) { 
    // the IList<int> is actually a List<int> 
} else { 
    // the IList<int> is some other kind of collection 
} 
+0

このアプローチを使用しない主な理由は、リストの各順列に対して試行錯誤のアプローチが必要なためです。 sgtz

+0

@sgtz:コレクションに含まれるものがわからない場合は、とにかくリストの内容にアクセスするために何か他のものを使用することはできません。 – Guffa

関連する問題