使普通方法通用

本文关键字:方法 | 更新日期: 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);
}