C#切换类型

时间:2015-12-17 23:00:39

标签: c# reflection switch-statement

编辑:This is now available in C# 7.0.

我有以下代码检查给定PropertyInfo的{​​{1}}。

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值。有什么提示吗?

6 个答案:

答案 0 :(得分:6)

现在可以在C#7.0中使用。

此解决方案适用于我原来的问题; up语句适用于switch的{​​{1}}而不是value

PropertyInfo

稍微更通用的答案:

PropertyType
  

参考:   https://blogs.msdn.microsoft.com/dotnet/2016/08/24/whats-new-in-csharp-7-0/

答案 1 :(得分:4)

我会完全按照要求回答这个问题:没有办法。

从C#6开始,

switch仅支持某些类型的匹配常量。你不是试图匹配常数。您多次调用IsAssignableFrom方法。

请注意,IsAssignableFrom 与匹配类型完全相同。因此,任何基于相等比较或哈希表的解决方案都无法工作。

我认为你拥有的if ... else if解决方案完全没问题。

答案 2 :(得分:3)

没有一般方法,但更常见的是,这些分支包含非常相似的代码。几乎总是适用于我的一种模式是使用字典;

var myIndex = new Dictionary<Type, string> {
    { typeof(string), "some text" },    
    { typeof(int), "a whole number" },    
    { typeof(decimal), "a fraction" },    
};

string description;
if (myIndex.TryGetValue(prop.PropertyType, out description)) {
    Console.WriteLine("This type is " + description);
} else {
    // 'default'
}

答案 3 :(得分:1)

使用你拥有的ToString方法,但不是文字值,而是使用case typeof(string).Name(如果可能的话)现在没有vs在我面前。

答案 4 :(得分:1)

首先,IsAssignableFrom比继承类型的字符串比较更好。 例如,typeof(TextReader).IsAssignableFrom(typeof(StreamReader))将为true,因为StreamReader继承自TextReader,也适用于接口。

如果您只需要直接比较,我可以建议创建Dictionary<Type,Action<PropertyInfo>>,例如:

var typeSelector = new Dictionary<Type, Action<PropertyInfo>>()
{
    {typeof(int), IntAction }
    {typeof(string), StringAction }
    {typeof(DateTime), DateTimeAction }
};

然后你可以像这样使用它:

Action<PropertyInfo> action;
if (typeSelector.TryGetValue(prop.PropertyType, out action))
    action(prop);
else 
    throw new InvalidDataException("Unsupported type");

在这种情况下,您必须为每种类型创建方法,或者在创建字典期间编写代码。

答案 5 :(得分:0)

如MårtenWikström的回答所示:“How to use switch-case on a Type?”您可以使用5432

Type.GetTypeCode