2017-06-21 11 views
2

私はDictionary<string,string> dictionaryを持っています。ここでキーはプロパティの名前を保持し、値は対応する値を保持します。私はいくつかの異なるモデルとそれらの異なるモデルを扱うGenericクラスを持っています。私はパターンマッチングによって関連するプロパティの値を設定しようとしています(良い方法がない限り)。c#汎用クラスのパターンマッチングプロパティ?

var record = new T(); 

foreach (var property in ReflectiveOps.Properties(record)) 
{ 
    if (dictionary.ContainsKey(property.Name)) 
    { 
     switch ...??? 

私はproperty.PropertyType、その後case intcase int iを切り替える試みたが、それは動作しませんでした。私はif(property.PropertyType.Name == "int"{...}を行うことができます - それは動作します。スイッチでこれを行うことはできますか?

+1

'property.PropertyType == typeof(int)'はより良いでしょう –

+0

@PatrickHofman:はい、しかし、それも 'if..then'ステートメントでしか動作しないようです。ケースに入れると、一定の値が予想されるというエラーが表示されます。 – ToshiBoy

+0

@PatrickHofmanしかし、素晴らしい提案です...(atmを捕まえるバグ、 "int32"という名前が "int"と違うが、あなたの 'typeof'と同じであることが分かった:-) – ToshiBoy

答えて

1

実行時に型指定されたプロパティを扱うアプローチの1つは、プロパティ型に基づいてアクションの辞書を構築することです。換言すれば、代わり

// This does not work, but imagine for a moment that it does: 
switch (property.PropertyType) { 
    case typeof(int): DoSomethingWithInt(property, val, obj); break; 
    case typeof(string): DoSomethingWithString(property, val, obj); break; 
    case typeof(long): DoSomethingWithLong(property, val, obj); break; 
    default: throw new InvalidOperationException($"Unsupported type: {property.PropertyType.Name}"); 
} 

書き込みの書き込みこの:

var opByType = new Dictionary<Type,Action<PropertyInfo,string,object>> { 
    { typeof(int), (p, s, o) => DoSomethingWithInt(property, val, obj) } 
, { typeof(string), (p, s, o) => DoSomethingWithString(property, val, obj) } 
, { typeof(long), (p, s, o) => DoSomethingWithLong(property, val, obj) } 
}; 

opByType辞書内のアクションは、コンパイルされないswitchの対応ケースの内部コードに対応します。

property.PropertyTypeを使用すると、そのタイプのアクションを取得し、そのアクションを呼び出すことができます。

関連する問題