2017-07-13 10 views
0

モジュール化されたアプリケーションのメソッドに、汎用のパラメータ(同じコレクション内で異なるタイプでもよい)のリスト/辞書を渡したいとします。 私のコードがそれをより良く説明できることを願っています。モジュール化されたアプリケーション汎用DTO

インタフェース:

public interface IField 
{ } 

public interface IField<T> : IField 
{ 
    T Value { get; } 
} 

実装クラス:

public class Field<T> : IField<T> 
{  
    public Field(T value) 
    { 
     Value = value; 
    } 
    public T Value { get; set; } 
} 

は今、私は私のパラメータを指定して辞書を作成し、(私が得る参照されていない別のアセンブリで実装されているメソッドを呼び出すことができますそれ用いた反射): 'MyMethodは' で今すぐ

static void Main(string[] args) 
{ 
    var dicFields = new Dictionary<string, IField>(); 
    dicFields.Add("param1", new Field<string>("Hello")); 
    dicFields.Add("param2", new Field<int>(15)); 

    MyMethod(dicFields); 
} 

、私が取得したいです辞書内の特定のパラメータの値:

public void MyMethod(IDictionary<string, IField> parameters) 
{ 
    var param2 = parameters["param2"]; 
} 

問題は、私が辞書の要素を定義するためにIField内のインタフェースを使用しているため「PARAM2」のないプロパティ値(一般型)を持っていることであり、我々はできる「MyMethodは」中パラメータの適切な実装を知っていません。

私の目標を達成するための提案はありますか?

答えて

0

このようにジェネリックスは機能しません。

汎用タイプを取得するには、辞書とメソッドでIField<T>インターフェースを使用する必要があります。あなたが希望のタイプを混在したい場合

public interface IField 
{ 

} 
public interface IField<T> : IField 
{ 
    T Value { get; } 
} 
public class Field<T> : IField<T> 
{ 
    public Field(T value) 
    { 
     Value = value; 
    } 
    public T Value { get; set; } 
} 
public void Generic() 
{ 

    var dicFields = new Dictionary<string, IField<string>>(); 
    dicFields.Add("param1", new Field<string>("Hello")); 
    dicFields.Add("param2", new Field<string>("Hello")); 

    MyMethod<String>(dicFields); 

} 
public void MyMethod<T>(IDictionary<string, IField<T>> parameters) 
{ 
    var param2 = parameters["param2"].Value; 
} 

しかし、あなたはクラスのインスタンスを作成するときにIField内のみTに制限されますので、タイプを混在できるようにするつもりはありませんあなたのタイプのボックスとVHS版する必要があろうIField内を使用する必要があります。

パブリックインタフェースIField内 {

} 
public interface IField<T> : IField 
{ 
    T Value { get; } 
} 
public class Field<T> : IField<T> 
{ 
    public Field(T value) 
    { 
     Value = value; 
    } 
    public T Value { get; set; } 
} 
public void Generic() 
{ 

    var dicFields = new Dictionary<string, IField<object>>(); 
    dicFields.Add("param1", new Field<object>("Hello")); 
    dicFields.Add("param2", new Field<object>(2)); 

    MyMethod<object>(dicFields); 

} 
public void MyMethod<T>(IDictionary<string, IField<T>> parameters) 
{ 
    var param2 = parameters["param2"].Value; 
} 

それはconsiですが悪い習慣dered、あなたはあなたがobject値と型を取得できるようになりますIFieldへのアクセス方法を追加するために行うことですしようとしているものを管理するためにDictionary<string, Dynamic>

Dictionary<string, dynamic> dict = new Dictionary<string, dynamic>(); 
dict.Add("value1", "a"); 
dict.Add("value2", 2); 
dict.Add("value3", 3); 
int result = dict["value2"] + dict["value3"]; 
+0

完全な回答ありがとうございました。私は最終的に私がジェネリックスを使ってそれをすることができないことを知った –

0

一つの方法を使用することができます。

public interface IField 
{ 
    object GetValue { get; } 
    Type GetValueType(); 
} 
+0

答えをありがとう。私はこの道を行くと思う。 –

関連する問題