2

假设我有一个方法:

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

4 回答 4

3

我认为最直接的方法就是反思。例如

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);
    }
}
于 2013-08-22T13:41:33.767 回答
2

您可以使用相同的语法从多个接口继承:

public void OtherMethod<T>() where T : class, IMyInterface {
...
}
于 2013-08-22T13:43:31.490 回答
1

这一行是错误的:

if (typeof(T) is IMyInterface) // have ascertained that T is IMyInterface
   DoStuff<T>();

typeof(T)返回 a Type,它永远不会是 a 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 的建议使用反射。

于 2013-08-22T13:48:52.357 回答
0

您的示例需要一些工作。你在这里做什么很大程度上取决于你IMyInterface在方法中的使用DoStuff<T>方式。

你的DoStuff方法真的需要T吗?还是只需要IMyInterface?在我的示例中,我将一个对象传递给OtherMethod,确定它是否实现IMyInterface、调用DoStuff和调用对象上的接口方法。

你在传递物体吗?您如何使用类型TIMyInterfaceinOtherMethodDoStuff

如果您的 DoStuff 方法需要T : IMyInterface同时了解类型T和接口,则它应该只需要泛型IMyInterface

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);
    }
}
于 2013-08-22T15:06:23.433 回答