2017-02-03 7 views
5

Учитывая следующий пример класс:Различать класс родового параметр типа и параметр метода общего типа

class Foo<T> 
{ 
    void Bar<S>(T inputT, S inputS) 
    { 
    // Some really magical stuff here! 
    } 
} 

Если я размышляю против метода Foo<>.Bar<>(...) и изучение типов параметров, скажу:

var argType1 = typeof(Foo<>).GetMethod("Bar").GetParameters()[0].ParameterType; 
var argType2 = typeof(Foo<>).GetMethod("Bar").GetParameters()[1].ParameterType; 

как argType1 и argType2 выглядят одинаково:

  • FullName свойство является пустым
  • Name свойство «T» или «S» соответственно
  • IsGenericParameter верно

Есть ли в информации о типе параметр, который позволяет мне различать, что первый аргумент определен на уровне уровня, тогда как второй аргумент является параметром типа уровня метода?

+1

'' DeclaringType' и DeclaringMethod' – PetSerAl

ответ

3

Я полагаю, вот так:

public static bool IsClassGeneric(Type type) 
    { 
     return type.IsGenericParameter && type.DeclaringMethod == null; 
    } 

И в коде:

class Program 
{ 
    static void Main(string[] args) 
    { 
     new Foo<int>().Bar<int>(1,1); 
    } 

    class Foo<T> 
    { 
     public void Bar<S>(T a, S b) 
     { 
      var argType1 = typeof(Foo<>).GetMethod("Bar").GetParameters()[0].ParameterType; 
      var argType2 = typeof(Foo<>).GetMethod("Bar").GetParameters()[1].ParameterType; 

      var argType1_res = Ext.IsClassGeneric(argType1);//true 
      var argType2_res = Ext.IsClassGeneric(argType2);//false 
     } 

    } 
} 
Смежные вопросы