使普通方法通用
本文关键字:方法 | 更新日期: 2023-09-27 18:30:20
我有以下方法,我很难使它通用。
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>"转换为"System.Linq.Expressions.Expression>"
错误 1 "MemberReference.Create(ISomeInterafce, System.Linq.Expressions.Expression>)"的最佳重载方法匹配有一些无效参数
我认为您需要做的就是将通用定义更改为
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
和调用 Create
中的as T
。
查看您的定义
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);
......
}
}
鉴于此:
public class MemberReference<K, M>
{
public static MemberReference<K, M> Create<K, M>(K obj, Expression<Func<K, M>> func) where K : class
{
return null;
}
}
然后进行以下工作:
private static void AddCheckBox<T>(CheckBox cb, Expression<Func<T, bool>> func) where T : class
{
var Tvar = (T) mSomeInterfaceAttribute; // Hopefully it is of this type, make that sure
var memRef = MemberReference<T, bool>.Create(Tvar, func);
}