4

C#式コンストラクトの使用を開始しましたが、次の状況でジェネリックスがどのように適用されるかについて質問があります。

MyObject多くの異なるタイプの基本クラスであるタイプがあると考えてください。このクラスの中には、次のコードがあります。

// This is a String Indexer Expression, used to define the string indexer when the object is in a collection of MyObjects
public Expression<Func<MyObject, string, bool>> StringIndexExpression { get; private set;}


// I use this method in Set StringIndexExpression and T is a subtype of MyObject
protected void DefineStringIndexer<T>(Expression<T, string, bool>> expresson) where T : MyObject
{
    StringIndexExpression = expression;
}

これは私が使用する方法ですDefineStringIndexer

public class MyBusinessObject : MyObject
{

   public string Name { get; set; }

   public MyBusinessObject() 
   {
       Name = "Test";
       DefineStringIndexer<MyBusinessObject>((item, value) => item.Name == value);
   }

}

ただし、内部の割り当てではDefineStringIndexer、コンパイルエラーが発生します。

タイプSystem.Linq.Expression.Expression<MyObject、string、bool>をSystem.Linq.Expression.Expression <MyBusinessObject、string、bool>>に暗黙的に変換することはできません。

この状況でジェネリックをC#式で使用できますか?ラムダ内にMyObjectをキャストしないように、DefineStringIndexerでTを使用したいと思います。

4

2 に答える 2

3

Func<MyBusinessObject,string,bool>タイプが と代入互換でないため、代入は機能しませんFunc<MyObject,string,bool>。ただし、2 つのファンクターのパラメーターには互換性があるため、ラッパーを追加して機能させることができます。

protected void DefineStringIndexer<T>(Func<T,string,bool> expresson) where T : MyObject {
    StringIndexExpression = (t,s) => expression(t, s);
}
于 2012-07-12T13:07:26.217 に答える
0

これはあなたにとってよりうまくいきますか?

編集:制約に追加<T>-必要になると思います:)

class MyObject<T>
{
    // This is a String Indexer Expression, used to define the string indexer when the object is in a collection of MyObjects 
    public Expression<Func<T, string, bool>> StringIndexExpression { get; private set;} 


    // I use this method in Set StringIndexExpression and T is a subtype of MyObject 
    protected void DefineStringIndexer<T>(Expression<T, string, bool>> expresson) 
        where T : MyObject<T> // Think you need this constraint to also have the generic param
    { 
        StringIndexExpression = expression; 
    } 
}

それから:

public class MyBusinessObject : MyObject<MyBusinessObject>
{ 

   public string Name { get; set; } 

   public MyBusinessObject()  
   { 
       Name = "Test"; 
       DefineStringIndexer<MyBusinessObject>((item, value) => item.Name == value); 
   } 

} 
于 2012-07-12T13:01:05.240 に答える