使通常的方法通用

时间:2013-09-06 09:56:48

标签: c#

我有以下方法,我在使用它时遇到一些困难。

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;)”的最佳重载方法匹配有一些无效的参数

2 个答案:

答案 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 : classas 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);
      ......
   }
}