我有一个接口,以及一些继承它的类。
public interface IFoo {}
public class Bar : IFoo {}
public class Baz : IFoo {}
如果我获得了实现IFoo
的类型,我该如何判断该类型是代表Bar
还是Baz
(而不是实际创建对象)?
// Get all types in assembly.
Type[] theTypes = asm.GetTypes();
// See if a type implement IFoo.
for (int i = 0; i < theTypes.Length; i++)
{
Type t = theTypes[i].GetInterface("IFoo");
if (t != null)
{
// TODO: is t a Bar or a Baz?
}
}
答案 0 :(得分:4)
if (theTypes[i] == typeof(Bar))
{
// t is Bar
}
else if (theTypes[i] == typeof(Baz))
{
// t is Baz
}
答案 1 :(得分:3)
t
既不是Bar
也不是Baz
- 它是IFoo
。 theTypes[i]
为Bar
或Baz
。
答案 2 :(得分:2)
当您执行GetInerface时,您只能获得界面。您需要做的只是获取实现该接口的类型。
var theTypes = asm.GetTypes().Where(
x => x.GetInterface("IFoo") != null
);
现在你可以遍历它们并执行此操作。或使用开关。
foreach ( var item in theTypes )
{
if ( item == typeof(Bar) )
{
//its Bar
}
else if ( item == typeof(Baz) )
{
///its Baz
}
}
答案 3 :(得分:1)
我认为这有助于解决您的问题:
IFoo obj = ...;
Type someType = obj.GetType();
if (typeof(Bar).IsAssignableFrom(someType))
...
if (typeof(Baz).IsAssignableFrom(someType))
...
答案 4 :(得分:0)
我错过了什么吗?
theTypes[i]
是类型。
答案 5 :(得分:0)
支持分析/重构的“Type X实现接口I”的强类型解决方案是:
Type x = ...;
bool implementsInterface = Array.IndexOf(x.GetInterfaces(), typeof(I)) >= 0;
那就是说,我真的不知道你想要完成什么。