我有一个接受IEnumerable<dynamic>
有没有办法测试方法中的动态类型,看它是否实现了特定的接口?
我的意图是这样的:
public void myMethod(IEnumerable<dynamicT> enumerable)
{
if (dynamicT is IInterface)
{
// do one thing
}
else if (dynamicT is IAnotherInterface)
{
// do another thing
}
}
更新
我应该包含这个重要事实:<T>
是动态的。
请原谅,我正在接近午夜,我正在编码。 : - $
答案 0 :(得分:5)
您可以使用Type.IsAssignableFrom
方法:
确定是否可以从指定Type的实例分配当前Type的实例。
public void myMethod(IEnumerable<T> enumerable)
{
if (typeof(IInterface).IsAssignableFrom(typeof(T))
{
// do one thing
}
else if (typeof(IAnotherInterface).IsAssignableFrom(typeof(T))
{
// do another thing
}
}
答案 1 :(得分:3)
is
关键字用于 对象 ,而 反射 是 型 强>:
您可以使用typeof(T).GetInterfaces()
来提取应用于特定类型的所有接口。
public void MyMethod(IEnumerable<T> enumerable)
{
var typeInterfaces = typeof(T).GetInterfaces();
if (typeInterfaces.Contains(typeof(IInterface))) {
// Something
}
else if(typeInterfaces.Contains(typeof(IAnotherInterface))) {
// Something Else
}
}
============根据评论更新============
如果T 动态 ,您无法从Type本身获取您正在寻找的信息,因为T可能代表任意数量的 不同类型 所有这些都在同一时间。
然而,您可以遍历每个元素并使用is
关键字测试对象本身。
public static void MyMethod<T>(IEnumerable<T> enumerable)
{
foreach (var dynObj in enumerable)
{
var typeInterfaces = dynObj.GetType().GetInterfaces();
if (typeInterfaces.Contains(typeof(IInterface))) {
// Something
}
else if(typeInterfaces.Contains(typeof(IAnotherInterface))) {
// Something Else
}
}
}
或者,如果您只想测试可枚举中的所有可能接口,则可以执行此操作:
public static void MyMethod<T>(IEnumerable<T> enumerable)
{
var allInterfaces = enumerable.SelectMany(e => e.GetType().GetInterfaces()).ToList();
if (allInterfaces.Contains(typeof(ITheFirstInterface)))
{
Console.WriteLine("Has The First Interface");
}
if (allInterfaces.Contains(typeof(ITheSecondInterface)))
{
Console.WriteLine("Has The Second Interface");
}
}
答案 2 :(得分:1)
请尝试以下方法。由于T
是动态的,因此您需要查看列表中的第一项以找出其类型。
public void myMethod<T>(IEnumerable<T> enumerable)
{
dynamic peek = enumerable.FirstOrDefault();
Type dtype = peek.GetType();
if (typeof(IInterface).IsAssignableFrom(dtype))
{
// do one thing
}
else if (typeof(IAnotherInterface).IsAssignableFrom(dtype))
{
// do another thing
}
}