编辑: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
值。有什么提示吗?
答案 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