2009-06-03 5 views
1

これは仕事ととしてOKですラムダパラメータを使用するときに型宣言を減らすにはどうすればよいですか?以下

(そこに多くの種類があり、すべてが本当に公開されていない心配しないでください!)私は

public class DataInfo<T> 
{ 
    public DataInfo(string description, Func<T, object> funcToGetValue) 
    { 
     this.description = description; 
     this.funcToGetValue= funcToGetValue; 
    } 

    public readonly string description; 
    public readonly Func<T, object> funcToGetValue; 
} 

public class DataType1 
{ 
    public int fieldA { get; set; } 
    public string fieldB { get; set; } 
} 

public class CurrentUse 
{ 
    static List<DataInfo<DataType1>> data1 = new List<DataInfo<DataType1>>() 
    { 
     new DataInfo<DataType1>("someStuff", data => data.fieldA), 
     new DataInfo<DataType1>("someOtherStuff", data => data.fieldB) 
    }; 
} 

を持っているいくつかのコードの大きく削減バージョンですそれが行く限り、しかし、私が繰り返さなければならないという事実new DataInfo<DataType1>は私を少し気にさせる。

私はそう

public class DataInfo 
{ 
    public static DataInfo<T> Create<T>(string description, Func<T, object> func) 
    { 
     return new DataInfo<T>(description, func); 
    } 
} 
public class DesiredUse 
{ 
    static List<DataInfo<DataType1>> data1 = new List<DataInfo<DataType1>>() 
    { 
     DataInfo.Create("someStuff", data => data.fieldA), 
     DataInfo.Create("someOtherStuff", data => data.fieldB) 
    }; 
} 

として私のためのオブジェクトを作成するためにDataInfoの非ジェネリックヘルパーverionを作成しようとしたが、それが型を推論することはできませんと、それはコンパイラがFIELDA & FIELDBを解決できないとそれが動作しません。のデータ。

重複したタイプ情報をどのように取り除くことができますか?

static List<DataInfo<DataType1>> data1 = new DataInfoListBuilder<DataType1> 
{ 
    { "someStuff", data => data.fieldA }, 
    { "someOtherStuff", data => data.fieldB } 
}.Build(); 

:次にとしてそれを使用

public sealed class DataInfoListBuilder<T> : IEnumerable 
{ 
    private readonly List<DataInfo<T>> list = new List<DataInfo<T>>(); 

    public void Add(string description, Func<T, object> function) 
    { 
     list.Add(DataInfo.Create<T>(description, function)); 
    } 

    public List<DataInfo<T>> Build() 
    { 
     return list; 
    } 

    public IEnumerator GetEnumerator() 
    { 
     throw new InvalidOperationException 
      ("IEnumerator only implemented for the benefit of the C# compiler"); 
    } 
} 

:私がいる限り、私はDataInfos

答えて

3

のリストで終わるように私は、ビルダークラスを作成したい、変更を加えること気にしません私はそれをテストしていないが、私はそれがうまくいくと思う。あなたが使用したい、その場合にはDataInfo、内で非ジェネリックタイプにすることができます:

static List<DataInfo<DataType1>> data1 = new DataInfo<DataType1>.Builder 
{ ... }.Build(); 
+0

ありがとうございましたジョンは、それは素晴らしいです! – Argos

0

あなたはおそらく一覧から継承>と特別なaddメソッドを提供することができます。

public class SpecialList<T> : List<DataInfo<T>> 
{ 
    public void Add(string description, Func<T, object> func) 
    { 
     base.Add(new DataInfo<T>(description, func)); 
    } 
} 

その後、次のように使用できます:

public class CurrentUse 
{ 
    public static SpecialList<DataType1> Data1 
    { 
     get 
     { 
      SpecialList<DataType1> list = new SpecialList<DataType1>(); 
      list.Add("someStuff", data => data.fieldA); 
      list.Add("someOtherStuff", data => data.fieldB); 

      return list; 
     } 
    } 
関連する問題