将对象同时转换为两个接口,以调用泛型方法

Bru*_*nez 13 .net c# generics casting interface

我想调用一个约束输入类型T的泛型方法来实现两个接口:

interface IA { }
interface IB { }
void foo<T>(T t) where T : IA, IB { }
Run Code Online (Sandbox Code Playgroud)

我怎样才能修复最后一行

void bar(object obj)
{
    if (obj is IA && obj is IB)
    {
        foo((IA && IB)obj);
    }
}
Run Code Online (Sandbox Code Playgroud)

反思可能允许拨打电话,但我希望保持在语言范围内.

kvb*_*kvb 6

您似乎误解了泛型如何工作:当调用具有泛型参数的方法时T,T必须在编译时静态地知道.虽然编译器有时可以推断它(因此您并不总是需要明确地将其写下来),但在调用方法时T 必须提供一些.在你的情况,你所知道的是,objIAIB,但是这并没有给你足够的信息来调用foo<T>,因为你不知道什么T应该是.你要么必须使用反射,强制转换为特定的,它实现两个类型IAIB,或做出更戏剧性的设计变更.


Amy*_*y B 4

C# 4.0 动态关键字能让您(大部分)免费出狱吗?毕竟 - 你已经在进行类型检查了。

interface IC : IA, IB { }

void bar(object obj)
{
  if (obj is IA && obj is IB)
  {
    IC x = (dynamic)obj;
    foo(x);
  }
}
Run Code Online (Sandbox Code Playgroud)

如果 foo 尝试将参数转换为 T ,这会中断吗?我不知道。