【问题标题】:How to write generic extension method which with one type argument for generic class with another type argument如何为具有另一个类型参数的泛型类编写具有一个类型参数的泛型扩展方法
【发布时间】: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 {}

我如何编写不需要第二类型参数的扩展方法,或者如何使用现有方法从用法中推断出第二类型参数?

【问题讨论】:

标签: c# generics extension-methods


【解决方案1】:

要在此处回答您的具体情况,您的扩展方法不需要 2 个通用参数。不需要 TType,因为在您的情况下 TType 和 TValue 将始终相同。只需去掉 TType 参数并将typeof(TValue) 传递到下面的方法中

public static TValue GetValue<TValue>(this ITypedValueProvider<TValue> valueProvider)
{
    return valueProvider.GetValue(typeof(TValue));
}

C# 无法推断 TType,因为从中可以看出它是一个完整的不相关类型。

TValue 是 ITypedValueProvider 的类型参数和返回类型。TType 只是一个“独立”类型参数,因此您需要指定它。

但是就像我说的,您显然希望 TType 和 TValue 是相同的类型,所以不要为 TType 烦恼,所做的只是让您需要指定感觉像是不需要的类型参数并让您容易遇到错误喜欢

ITypedValueProvider<string> valueProvider = GetValueProvider();
valueProvider.GetValue<int>(); //what would this end up doing, definately not what you want though

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-25
    • 1970-01-01
    • 2011-08-09
    相关资源
    最近更新 更多