我如何可以使这项工作?

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 (...)
{
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top