c#通用类的模式匹配属性?

时间:2017-06-21 13:15:44

标签: c# generics properties switch-statement

我有一个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 intcase int i,但这不起作用。我可以做if(property.PropertyType.Name == "int"{...} - 这有效。可以用开关完成吗?

1 个答案:

答案 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检索该类型的操作,并调用该操作。