假设我有一个方法:
public void DoStuff<T>() where T : IMyInterface {
...
}
在其他地方,我想打电话给另一种方法
public void OtherMethod<T>() where T : class {
...
if (typeof(T) is IMyInterface) // have ascertained that T is IMyInterface
DoStuff<T>();
}
有没有什么方法可以将T转换成我的界面?
DoStuff<(IMyInterface)T>
和其他类似的变体对我不起作用。
编辑:感谢您指出typeof(T) is IMyInterface
是检查接口的错误方法,而应该在实际的T实例上调用。
Edit2 :我发现(IMyInterface).IsAssignableFrom(typeof(T))
正在检查界面。
答案 0 :(得分:3)
我认为最直接的方法是反思。 E.g。
public void OtherMethod<T>() where T : class {
if (typeof(IMyInterface).IsAssignableFrom(typeof(T))) {
MethodInfo method = this.GetType().GetMethod("DoStuff");
MethodInfo generic = method.MakeGenericMethod(typeof(T));
generic.Invoke(this, null);
}
}
答案 1 :(得分:2)
您可以使用相同的语法从多个接口继承:
public void OtherMethod<T>() where T : class, IMyInterface {
...
}
答案 2 :(得分:1)
这一行错了:
if (typeof(T) is IMyInterface) // have ascertained that T is IMyInterface
DoStuff<T>();
typeof(T)
会返回Type
,永远将成为IMyinterface
。如果你有一个T的实例,你可以使用
if (instanceOfT is IMyInterface) // have ascertained that T is IMyInterface
DoStuff<T>();
或
if (instanceOfT is IMyInterface) // have ascertained that T is IMyInterface
DoStuff<IMyInterface>();
否则,您可以将反射用作Tim S suggests。
答案 3 :(得分:0)
你的例子需要一点工作。你在这里做的很大程度上取决于你如何在DoStuff方法中使用IMyInterface。
你的DoStuff方法真的需要&#34; T&#34;?或者只是需要&#34; IMyInterface&#34;?在我的例子中,我将一个对象传递给&#34; OtherMethod&#34;,确定它是否实现了IMyInterface&#34;,调用DoStuff,并在对象上调用接口方法。
你是否在传递物体?你是如何使用类型&#34; T&#34;和&#34; IMyInterface&#34;在OtherMethod和DoStuff中?
如果DoStuff方法需要同时知道类型&#34; T&#34;和界面&#34; IMyInterface&#34;。
public void DoStuff(IMyInterface myObject)
{
myObject.InterfaceMethod();
}
public void OtherMethod<T>(T myObject)
where T : class
{
if (myObject is IMyInterface) // have ascertained that T is IMyInterface
{
DoStuff((IMyInterface)myObject);
}
}