.net - 当参数没有这些约束时,如何调用具有类型约束的泛型方法?

标签 .net generics type-constraints

class A { }
interface I { }
void GenericStuff<T>(T x) { }
void SpecificStuff<T>(T x) where T : A, I { }

void Start<T>(T x)
{
    if (x is A && x is I)
        SpecificStuff(x); // <---- Wrong type
    else
        GenericStuff(x);
}

我遇到了上面所示的情况。在方法 Start() 中,我得到一个参数 x ,根据它的类型,我想调用 GenericStuff() >SpecificStuff() 方法。当然,类型约束阻止我这样做,并且由于有两个约束,我无法通过强制转换来绕过它们。

有什么方法(无需反射(reflection))可以实现这一点吗?

最佳答案

您可以使用动态。虽然这或多或少是美化的反射,但它看起来更好:

void Start<T>(T x)
{
    if (x is A && x is I)
        SpecificStuff((dynamic)x);
    else
        GenericStuff(x);
}

请注意:
如果稍后您更改 SpecificStuff 的类型约束以包含第三个接口(interface),并且您忘记相应地更新您的 if,您将收到运行时异常并且无法编译时间错误。

关于.net - 当参数没有这些约束时,如何调用具有类型约束的泛型方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15808370/

相关文章:

java - 将抽象/通用对象传递给方法

c# - 如果 A<T1,T2> 是实际类型的模板,那么为什么允许 typeof(A<,>) ?

java - 枚举<?扩展界面>

generics - 如何表达函数的类型约束以允许添加不同类型的值?

C# Remoting - 如何关闭 CustomErrors

.net - Oracle Managed ODP.NET找不到tnsnames.ora

.net - FileInfo.LastWriteTime 可能会产生误导。还有其他方法吗?

C#语言 : Garbage Collection, SuppressFinalize

c# - 创建一个采用泛型类型的 IEnumerable 类型的方法

c# - 泛型 C# 上的类型约束 - 多重约束