无法从用法中推断出方法的类型参数。请尝试专门指定类型参数

时间:2017-11-23 08:56:39

标签: c# generics

我尝试使用表达式和泛型来创建一个集合通用方法来帮助构建字典,其中字典的键和值的类型可以是任何类型。

到目前为止,我已经:

public class DictionaryServices<T>
{
    private readonly IGenericRepository<T> _repo;

    public DictionaryServices(IGenericRepository<T> repo)
    {
        _repo = repo;
    }

    public Dictionary<TKey, TValue> BuildDictionary<TObject, TKey, TValue>(Expression<Func<TObject, TKey>> keyExp, Expression<Func<TObject, TValue>> valueExp)
    {
        var allItems = _repo.GetAll();
        Dictionary<TKey, TValue> dictionary = new Dictionary<TKey, TValue>();
        foreach (var item in allItems)
        {
            var keyMe = keyExp.Body as MemberExpression;

            dictionary.Add(GetValue(keyExp, item), GetValue(valueExp, item));
        }
        return dictionary;
    }

    private TType GetValue<TObject, TType>(Expression<Func<TObject, TType>> exp, TObject item)
    {
        var me = exp.Body as MemberExpression;
        var propInfo = me.Member as PropertyInfo;
        return (TType)propInfo.GetValue(item, null);
    }
}

当我编译时,我得到错误&#34;方法的类型参数不能从用法中推断出来。请尝试专门指定类型参数。&#34;对于GetValue的两种用法,但我不明白为什么。如果我删除GetValue函数并复制它在foreach中对键和值所做的操作,那么它可以正常工作。有没有人有任何想法,为什么我会收到这个错误?

1 个答案:

答案 0 :(得分:2)

您的TObject定义中不需要BuildDictionary个通用参数,因为您的定义中的T参数具有相同的含义(即 - T是您的存储库中的对象类型)。所以改变BuildDictionary就像这样:

public Dictionary<TKey, TValue> BuildDictionary<TKey, TValue>(
    Expression<Func<T, TKey>> keyExp, 
    Expression<Func<T, TValue>> valueExp)

您也可以从TObject删除GetValue,但这不是必需的:

private TType GetValue<TType>(Expression<Func<T, TType>> exp, T item)

您当前的方法不起作用,因为您有两个具有相同含义的不同泛型类型参数:类级别为T,方法级别为TObject。您的_repo.GetAll()会返回T的列表,但该方法适用于TObject类型的对象,这些对象可能不同。