作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我有一个方法:
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/
我是一名优秀的程序员,十分优秀!