2017-06-21 49 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

處理在運行時鍵入的屬性的一種方法是基於屬性類型構造一個動作字典。換句話說,而不是寫

// 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來檢索該類型的操作並調用該操作。