Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使普通方法通用_C# - Fatal编程技术网

C# 使普通方法通用

C# 使普通方法通用,c#,C#,我有下面的方法,我有一些困难,使其通用 private void AddCheckBox(CheckBox cb, Expression<Func<ISomeInterface, bool>> func) { var memRef = MemberReference.Create(mSomeInterfaceAttribute, func); ....... } 这就是我所尝试的: private void AddCheckBox<T>(Ch

我有下面的方法,我有一些困难,使其通用

private void AddCheckBox(CheckBox cb, Expression<Func<ISomeInterface, bool>> func)
{
    var memRef = MemberReference.Create(mSomeInterfaceAttribute, func);
    .......
}
这就是我所尝试的:

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.CreateISomeInterafce,System.Linq.Expressions.Expression>”的最佳重载方法匹配具有一些无效参数


看看你的定义

MemberReference<K, M> Create<K, M>(K obj, Expression<Func<K, M>> func) where K : class
另外,您不需要为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);
      ......
   }
}

看看你的定义

MemberReference<K, M> Create<K, M>(K obj, Expression<Func<K, M>> func) where K : class
另外,您不需要为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);
      ......
   }
}

我想你需要做的就是把你的一般定义改成

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。

我认为您需要做的就是将泛型定义更改为

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。

鉴于此:

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);
}
鉴于此:

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);
}


还有什么不起作用?编译器错误?抱歉,我已经更新了这个问题,我得到了无效的参数errorK有requirement类所以T必须太私有void AddCheckBoxCheckBox cb,Expression func where T:classWhich argumnet?不要羞于发布完整错误。请确保mSomeInterfaceAttribute的类型为t。还有什么不起作用?编译器错误?抱歉,我已经更新了这个问题,我得到了无效的参数errorK有requirement类所以T必须太私有void AddCheckBoxCheckBox cb,Expression func where T:classWhich argumnet?不要羞于发布完整错误。请确保mSomeInterfaceAttribute的类型为t。我将方法更改为:private void AddCheckBoxCheckBox cb,Expression func where t:class。还是一样吗errors@vBx更新了答案,但您需要解释mSomeInterfaceAttribute的来源。我将方法更改为:private void AddCheckBoxCheckBox cb,Expression func where T:class。还是一样吗errors@vBx更新了答案,但你需要解释mSomeInterfaceAttribute的来源。是的,它可以工作,但是如果我想使用一个接口而不是方法中的T呢。我想要这样的东西:ifT是Interface1 Craetem作为Interafce1,ifT是Interface2 Createm作为Interface2。希望我能说清楚,很抱歉没有从一开始就提到这一点。或者我可以留下这段代码,但我也有一个字典,我需要将类型T添加到其中,但我需要我不知道,将它转换到我的类型IsomeInterface。你也可以在定义中指定第二个类型并使用它。按照AddCheckBox的行进行操作,然后将MemberReference.CreateMSomeInterfaceAttribute写入T,func。您可能需要为新的类型参数添加相同的where子句。是的,它可以工作,但是如果在方法中我想使用接口而不是T呢。我想要这样的东西:ifT是Interface1 Craetem作为Interafce1,ifT是Interface2 Createm作为Interface2。希望我能说清楚,很抱歉没有从一开始就提到这一点。或者我可以留下这段代码,但我也有一个字典,我需要将类型T添加到其中,但我需要我不知道,将它转换到我的类型IsomeInterface。你也可以在定义中指定第二个类型并使用它。按照AddCheckBox的行进行操作,然后将MemberReference.CreateMSomeInterfaceAttribute写入T,func。您可能需要为新类型参数添加相同的where子句。