Cast T有接口吗?

时间:2013-08-22 13:37:31

标签: c# generics interface casting

假设我有一个方法:

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))正在检查界面。

4 个答案:

答案 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);
        }
    }