gpt4 book ai didi

c# - 如何使用没有约束的类型参数调用具有泛型约束的方法?

转载 作者:行者123 更新时间:2023-11-30 15:15:04 27 4
gpt4 key购买 nike

假设我有一个方法:

public void ExampleMethod<T>(T x) where T : struct // or new()
{
// example usage, similar to what's actually happening
var z = (T)Enum.Parse(typeof(T), privateFieldOfTypeString);

// do something depending on values of x and z
// possibly using other methods that require them being enums

// or in case of the new() constraint:
// var t = new T() and do something together with x
}

我想按如下方式使用它:

public void CallerMethod<S>(S y)
{
if (typeof(S).IsEnum) // or some other invariant meaning that `S` is "new()able"
{
ExampleMethod(y); // won't compile
}
}

所以,在运行时我知道 S满足 ExampleMethod<T> 的约束.我知道可以使用反射来调用它,类似于:

this
.GetType()
.GetMethod(nameof(ExampleMethod<object>))
.MakeGenericMethod(typeof(S))
.Invoke(this, new object[] { y });

没有反射可能吗?

注意:这是来自真实示例的简化代码,显然我无法控制这些方法的签名,因此答案是“将约束添加到 CallerMethod”和“从 ExampleMethod 中删除约束“无效。

是的,整个事情应该重新设计,这样整个问题就不会出现了。但在现实生活中,“整件事情”往往太大、太耦合且重写的风险太大。一些要求以意想不到的方式发生了变化 - 因此出现了明显的代码味道,我试图通过将其隐藏在一个看起来很讨厌的地方来尽量减少这种味道。

最佳答案

你可以使用dynamic:

if (typeof(S).IsEnum)
{
ExampleMethod((dynamic)y);
}

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com