【发布时间】:2021-03-22 22:13:14
【问题描述】:
我有如下界面
public interface ITypedValueProvider<TValue>
{
TValue GetValue(Type type);
}
我想创建允许我从泛型类型参数中获取类型的扩展方法。我写了一个扩展方法,如下所示。
public static class Extensions
{
public static TValue GetValue<TType, TValue>(this ITypedValueProvider<TValue> valueProvider)
{
return valueProvider.GetValue(typeof(TType));
}
}
但是,这个扩展方法需要 2 个类型参数,我只需要使用一个,希望其他的可以从输入的泛型类中推断出来。
static class Program
{
void Main()
{
ITypedValueProvider<int> valueProvider = new ValueProvider<int>(typeof(TargetValueConsumer));
var value = valueProvider.GetValue<TargetValueConsumer, int>() //This line will work
var value = valueProvider.GetValue<TargetValueConsumer>(); //This one, obviously, won't compile
}
}
public class ValueProvider<TValue> : ITypedValueProvider<TValue>
{
private readonly (Type ConsumerType, TValue Value) _record;
public ValueProvider(TValue value, Type type)
{
_record = (type, value);
}
TValue GetValue(Type type)
{
if (_record.ConsumerType == type)
return _record.Value;
return default;
}
}
public class TargetValueConsumer {}
我如何编写不需要第二类型参数的扩展方法,或者如何使用现有方法从用法中推断出第二类型参数?
【问题讨论】:
-
Why doesn't C# infer my generic types? 此外,混合泛型和
Type实例看起来不是一个好方法,IMO -
@PavelAnikhouski,感谢您的评论。将查看链接。
标签: c# generics extension-methods