我尝试使用表达式和泛型来创建一个集合通用方法来帮助构建字典,其中字典的键和值的类型可以是任何类型。
到目前为止,我已经:
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中对键和值所做的操作,那么它可以正常工作。有没有人有任何想法,为什么我会收到这个错误?
答案 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
类型的对象,这些对象可能不同。