我有一个Dictionary<string,string> dictionary
,其中键包含属性的名称,值为相应的值。然后我有许多不同的模型和一个处理这些不同模型的Generic类。我试图通过模式匹配来设置相关属性的值(除非有更好的方法?)。
var record = new T();
foreach (var property in ReflectiveOps.Properties(record))
{
if (dictionary.ContainsKey(property.Name))
{
switch ...???
我尝试切换property.PropertyType
,然后切换case int
和case int i
,但这不起作用。我可以做if(property.PropertyType.Name == "int"{...}
- 这有效。可以用开关完成吗?
答案 0 :(得分:2)
处理在运行时键入的属性的一种方法是根据属性类型构造操作字典。换句话说,而不是写
// 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
检索该类型的操作,并调用该操作。