获取的通用接口,一个类实现的类型参数(Getting type arguments of gener

2019-06-26 04:28发布

我有一个通用的接口,说IGeneric。 对于给定的类型,我想找到通过IGeneric通用论点一类imlements。

正是在这个例子中更加清晰:

Class MyClass : IGeneric<Employee>, IGeneric<Company>, IDontWantThis<EvilType> { ... }

Type t = typeof(MyClass);
Type[] typeArgs = GetTypeArgsOfInterfacesOf(t);

// At this point, typeArgs must be equal to { typeof(Employee), typeof(Company) }

什么是GetTypeArgsOfInterfacesOf(T型)的实施?

注:可以假设GetTypeArgsOfInterfacesOf方法是IGeneric而编写的。

编辑:请注意,我特别问如何从所有MYCLASS实现的接口过滤掉IGeneric接口。

相关阅读: 找出如果一个类型实现了一个通用接口

Answer 1:

要限制它的通用接口的只是一个特定的味道,你需要得到泛型类型定义,并比较了“开放式”界面( IGeneric<> -请注意,没有“T”规定):

List<Type> genTypes = new List<Type>();
foreach(Type intType in t.GetInterfaces()) {
    if(intType.IsGenericType && intType.GetGenericTypeDefinition()
        == typeof(IGeneric<>)) {
        genTypes.Add(intType.GetGenericArguments()[0]);
    }
}
// now look at genTypes

或者像LINQ查询语法:

Type[] typeArgs = (
    from iType in typeof(MyClass).GetInterfaces()
    where iType.IsGenericType
      && iType.GetGenericTypeDefinition() == typeof(IGeneric<>)
    select iType.GetGenericArguments()[0]).ToArray();


Answer 2:

typeof(MyClass)
    .GetInterfaces()
    .Where(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IGeneric<>))
    .SelectMany(i => i.GetGenericArguments())
    .ToArray();


Answer 3:

  Type t = typeof(MyClass);
            List<Type> Gtypes = new List<Type>();
            foreach (Type it in t.GetInterfaces())
            {
                if ( it.IsGenericType && it.GetGenericTypeDefinition() == typeof(IGeneric<>))
                    Gtypes.AddRange(it.GetGenericArguments());
            }


 public class MyClass : IGeneric<Employee>, IGeneric<Company>, IDontWantThis<EvilType> { }

    public interface IGeneric<T>{}

    public interface IDontWantThis<T>{}

    public class Employee{ }

    public class Company{ }

    public class EvilType{ }


文章来源: Getting type arguments of generic interfaces that a class implements