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

第二に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);
      ......
   }
}
于 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 に答える