题
我如何可以使这项工作?
switch(property.PropertyType){
case typeof(Boolean):
//doStuff
break;
case typeof(String):
//doOtherStuff
break;
default: break;
}
我不想使用的名称由于串的比较的类型就是否诚实和可能受到改变。
解决方案
System.Type propertyType = typeof(Boolean);
System.TypeCode typeCode = Type.GetTypeCode(propertyType);
switch (typeCode)
{
case TypeCode.Boolean:
//doStuff
break;
case TypeCode.String:
//doOtherStuff
break;
default: break;
}
你可以使用混合方法,用于代码。对象你的动态,如果有类型的.这是很快的,因为第一部分-关编译器可以决定基于一个查找表。
其他提示
你不能。你可以做的是创建一映类型之间和代表使用的一个词典:
var TypeMapping = new Dictionary<Type, Action<string>>(){
{typeof(string), (x)=>Console.WriteLine("string")},
{typeof(bool), (x)=>Console.WriteLine("bool")}
};
string s = "my string";
TypeMapping[s.GetType()]("foo");
TypeMapping[true.GetType()]("true");
我觉得你在找什么在这里是一个很好的地图。使用各位代表和一个一般IDictionary你可以做你想要什么。
试试这样的事情:
private delegate object MyDelegate();
private IDictionary<Type, MyDelegate> functionMap = new IDictionary<Type, MyDelegate>();
public Init()
{
functionMap.Add(typeof(String), someFunction);
functionMap.Add(tyepof(Boolean), someOtherFunction);
}
public T doStuff<T>(Type someType)
{
return (T)functionMap[someType]();
}
我个人喜欢的 Dictionary<Type, other>
方法的最...我甚至可以提供你另一个例子: http://www.timvw.be/presenting-namevaluecollectionhelper/
在情况下,您坚持在写一个关情况下的声明可以使用该类型的名字...
switch (blah.PropertyType.FullName)
{
case typeof(int).FullName: break;
case typeof(string).FullName: break;
}
C#7.0将支持开关在类型作为一部分的更大的模式匹配的功能。这个例子是从 .网的博客 宣布新的特点:
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("<unknown shape>");
break;
case null:
throw new ArgumentNullException(nameof(shape));
}
不用担心使用的字符串在一个开关,因为如果你有几个编译器将会自动转换到哈希查给予体面的绩效,尽管它看起来很漂亮.
问题的类型字符串的变化可以解决的,使它成为一个明确的散列查找自己和填充constents的散列在一个静态的构造。这样的散列的填充有正确的串在运行时使他们保持正确的。
你不能这么做有关在c#作为的情况下,必须定。
什么是错误的:
if(property.PropertyType == typeof(bool)) {
//dostuff;
}
else if (property.PropertyType == typeof(string)) {
//do other stuff;
}
我最近有做类似的东西而使用开关不是一个选项。做一==的类型(x)是好的,但更典雅的方式可能做这样的事情:
if(property.PropertyType is bool){
//dostuff;
}
else if (property.PropertyType is string){
//do other stuff;
}
但是,我不确定你可以使用的"是"的关键词以这种方式,我认为它仅适用于对象...
有关stringmatching:这是一个请求数在的问题不做它通过stringmatching.
该词典是一个办法,我会用当我把这整个化算法在其自己的图书馆。因为现在我会第一次尝试的代码如我的情况下,只使用基本类型。如果这不起作用我会回去的群的如果别人:S
之前人问我为什么我要我自己的序列化:1).净xml化不列化特性没有制定者 2)化已经遵守对某些传统规则
只是使用正常的,如果/else if/人模式:
if (property.PropertyType == typeof(Boolean))
{
}
else if (property.PropertyType == typeof(String))
{
}
else if (...)
{
}