编辑:现在可以在C#7.0中使用.
我有以下的片,检查给定的代码PropertyInfo
的type
.
PropertyInfo prop; // init prop, etc... if (typeof(String).IsAssignableFrom(prop.PropertyType)) { // ... } else if (typeof(Int32).IsAssignableFrom(prop.PropertyType)) { // ... } else if (typeof(DateTime).IsAssignableFrom(prop.PropertyType)) { // ... }
有没有办法switch
在这种情况下使用语句?这是我目前的解决方案:
switch (prop.PropertyType.ToString()) { case "System.String": // ... break; case "System.Int32": // ... break; case "System.DateTime": // ... break; default: // ... break; }
我不认为这是最好的解决方案,因为现在我必须给出给定的完全限定String
值type
.有小费吗?
现在可以在C#7.0中使用它.
这个解决方案适合我原来的问题; switch
语句的工作value
的PropertyInfo
,而不是它的PropertyType
:
PropertyInfo prop; // init prop, etc... var value = prop.GetValue(null); switch (value) { case string s: // ... break; case int i: // ... break; case DateTime d: // ... break; default: // ... break; }
稍微更通用的答案:
switch(shape) { case Circle c: WriteLine($"circle with radius {c.Radius}"); break; case Rectangle s when (s.Length == s.Height): WriteLine($"{s.Length} x {s.Height} square"); break; case Rectangle r: WriteLine($"{r.Length} x {r.Height} rectangle"); break; default: WriteLine(""); break; case null: throw new ArgumentNullException(nameof(shape)); }
参考:https: //blogs.msdn.microsoft.com/dotnet/2016/08/24/whats-new-in-csharp-7-0/
我将完全按照询问的方式回答问题:没有办法。
switch
从C#6开始,仅支持某些类型的匹配常量。您没有尝试匹配常量。您IsAssignableFrom
多次调用该方法。
请注意,这IsAssignableFrom
是不相同的精确匹配的类型。因此,任何基于相等性比较或哈希表的解决方案都行不通。
我认为if ... else if
您拥有的解决方案完全可以。