I have a generic interface, say IGeneric. For a given type, I want to find the generic arguments which a class imlements via IGeneric.
我有一个通用接口,比如IGeneric。对于给定的类型,我想找到一个类通过IGeneric实现的泛型参数。
It is more clear in this example:
在这个例子中更清楚:
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) }
What is the implementation of GetTypeArgsOfInterfacesOf(Type t)?
GetTypeArgsOfInterfacesOf(Type t)的实现是什么?
Note: It may be assumed that GetTypeArgsOfInterfacesOf method is written specifically for IGeneric.
注意:可以假设GetTypeArgsOfInterfacesOf方法是专门为IGeneric编写的。
Edit: Please note that I am specifically asking how to filter out IGeneric interface from all the interfaces that MyClass implements.
编辑:请注意我特别询问如何从MyClass实现的所有接口中过滤掉IGeneric接口。
Related: Finding out if a type implements a generic interface
相关:确定类型是否实现了通用接口
3 个解决方案
#1
To limit it to just a specific flavor of generic interface you need to get the generic type definition and compare to the "open" interface (IGeneric<>
- note no "T" specified):
要将它限制为通用接口的特定风格,您需要获取泛型类型定义并与“open”接口进行比较(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
Or as LINQ query-syntax:
或者作为LINQ查询语法:
Type[] typeArgs = (
from iType in typeof(MyClass).GetInterfaces()
where iType.IsGenericType
&& iType.GetGenericTypeDefinition() == typeof(IGeneric<>)
select iType.GetGenericArguments()[0]).ToArray();
#2
typeof(MyClass)
.GetInterfaces()
.Where(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IGeneric<>))
.SelectMany(i => i.GetGenericArguments())
.ToArray();
#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{ }
#1
To limit it to just a specific flavor of generic interface you need to get the generic type definition and compare to the "open" interface (IGeneric<>
- note no "T" specified):
要将它限制为通用接口的特定风格,您需要获取泛型类型定义并与“open”接口进行比较(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
Or as LINQ query-syntax:
或者作为LINQ查询语法:
Type[] typeArgs = (
from iType in typeof(MyClass).GetInterfaces()
where iType.IsGenericType
&& iType.GetGenericTypeDefinition() == typeof(IGeneric<>)
select iType.GetGenericArguments()[0]).ToArray();
#2
typeof(MyClass)
.GetInterfaces()
.Where(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IGeneric<>))
.SelectMany(i => i.GetGenericArguments())
.ToArray();
#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{ }