我想创建一个帮助器方法来为MVC生成一个DropDown我已经涉足了表达式和反射,并且已经能够获取以下工作:方法的类型参数可以在方法调用中推断为1但不是2参数
public static DropDown GenerateDropDown<TSource, TProperty>(IEnumerable<TSource> source,
Expression<Func<TSource, TProperty>> text,
Expression<Func<TSource, object>> value,
string selectedValue = "",
string placeholder = "") where TSource : class
{
...
return new DropDown(...);
}
我可以比使用下面的代码来生成一个下拉
DropDown.GenerateDropDown(routes, r => r.Name, r => r.Id, selectedValue, "Please Select One");
这种使用类型推断聚集在列表(IEnumerable的)将是什么样的数据,并帮助我们确定应使用哪些属性作为文本和值,命名为a nd Id。
注意上面的代码有效!不过,我不喜欢使用object
作为Expression<Func<TSource, object>> value
参数的第二个参数(它不能提供良好的智能感知)。但是,当我将其更改为Expression<Func<TSource, TProperty>> value
(就像它上面的参数),我得到的错误如下:
Error CS0411 The type arguments for method 'DropDown.GenerateDropDown<TSource, TProperty>(IEnumerable<TSource>, Expression<Func<TSource, TProperty>>, Expression<Func<TSource, TProperty>>, string, string)' cannot be inferred from the usage. Try specifying the type arguments explicitly.
这究竟是为什么?怎么可能有1个工作,但当添加/更改为2时,它会失败?
任何帮助非常感谢,提前致谢!
“r.Name”和“r.Id”的数据类型是什么? –
@ScottChamberlain抱歉,我无法看到数据类型的重要性,但Name是字符串,Id是小数。 – Tyler
'TProperty'不能引用2个不同的东西 - 你可以尝试'GenerateDropDown'和'Expression >文本,表达式>值,但是它不清楚这是什么点 –