1

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

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

4

3 回答 3

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

于 2013-09-06T10:07:08.273 回答
2

看你的定义

MemberReference<K, M> Create<K, M>(K obj, Expression<Func<K, M>> func) where K : class

首先有K一个类的要求,所以这意味着你的addcheckbox方法也必须声明T : class

其次doesmSomeInterfaceAttribute从哪里来,需要定义为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);
      ......
   }
}
于 2013-09-06T10:06:50.143 回答
1

鉴于这种:

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);
}
于 2013-09-06T10:10:16.453 回答