我有以下方法,我在使用它时遇到一些困难。
private void AddCheckBox(CheckBox cb, Expression<Func<ISomeInterface, bool>> func)
{
var memRef = MemberReference.Create(mSomeInterfaceAttribute, func);
.......
}
MemberReference.Create
的定义是:
public static MemberReference<K, M> Create<K, M>(K obj, Expression<Func<K, M>> func) where K : class;
这就是我的尝试:
private void AddCheckBox<T>(CheckBox cb, Expression<Func<T, bool>> func)
{
var memRef = MemberReference.Create<T, bool>(mSomeInterfaceAttribute, func);
......
}
我收到无效的参数错误:
错误2参数2:无法从'System.Linq.Expressions.Expression&gt;'转换到'System.Linq.Expressions.Expression&gt;'
错误1“MemberReference.Create(ISomeInterafce,System.Linq.Expressions.Expression&gt;)”的最佳重载方法匹配有一些无效的参数
答案 0 :(得分:3)
我认为您需要做的就是将通用定义更改为
private void AddCheckBox<T>(CheckBox cb, Expression<Func<T, bool>> func) where T : class
{
var memRef = MemberReference.Create<T, bool>(mSomeInterfaceAttribute as T, func);
(....)
}
请注意定义末尾的where T : class
和as T
调用中的Create
。
答案 1 :(得分:2)
查看您的定义
MemberReference<K, M> Create<K, M>(K obj, Expression<Func<K, M>> func) where K : class
首先要求K
是一个类,这意味着您的addcheckbox
方法也必须声明T : class
其次mSomeInterfaceAttribute
来自何处,需要将其定义为类型T?
假设您已将此声明为类字段,则需要创建类而不是方法泛型。
例如
class MyClass<T> where T: class
{
private T mSomeInterfaceAttribute;
private void AddCheckBox(CheckBox cb, Expression<Func<T, bool>> func)
{
var memRef = MemberReference.Create<T, bool>(mSomeInterfaceAttribute, func);
......
}
}
另外,您不需要为MemberReference.Create指定类型参数,因为他们可以推断出它们。允许你这样做
class MyClass<T> where T: class
{
private T mSomeInterfaceAttribute;
private void AddCheckBox(CheckBox cb, Expression<Func<T, bool>> func)
{
var memRef = MemberReference.Create(mSomeInterfaceAttribute, func);
......
}
}