如何重写if(...)来切换识别动态类类型?

时间:2011-05-05 08:57:16

标签: c#

  

可能重复:
  Using Case/Switch and GetType to determine the object

如果我希望用语法重写我的代码if(...)else if(...)into switch with(...)case with following code,如何实现呢?

void Foo(object aObj) {
      if (aObj is Dictionary<int,object> ) {

      } else if (aObj is string) {

      } else if (aObj is int) {

      } else if (aObj is MyCustomClass) {

      } else {
         throw new Exception("unsupported class type.");
      }
   }

5 个答案:

答案 0 :(得分:4)

直到今天我发现的唯一方法是做这样的事情:

在你的班级中定义一个词典:

 private static Dictionary<Type, int> typeMap = new Dictionary<Type, int>();

然后在你的类构造函数中用你使用的任何类型填充你的词典:

typeMap.Add(typeof(float), 0);
typeMap.Add(typeof(OpenTK.Graphics.Color4), 1);
typeMap.Add(typeof(LightStructure), 2);
typeMap.Add(typeof(Camera), 3);

在您的代码中,您可以使用:

object values = new OpenTK.Graphics.Color4(1.0,1.0,1.0)
switch (typeMap[values.GetType()])
{
  ...
}

在这个例子中,你最终会遇到案例1。

答案 1 :(得分:0)

在C#中,您无法根据System.Type切换或实现案例。

答案 2 :(得分:0)

您可以使用类型名称:

void Foo(object aObj) {
  switch (aObj.GetType().Name) {
    case "Dictionary`2":
      if (String.Join(",",aObj.GetType().GetGenericArguments().Select(a => a.Name)) == "Int32,String") {
        // ok
      } else {
        throw new ArgumentException("unsupported types in dictionary.");
      }
      break;
    case "String" {
      break;
    case "Int32" {
      break;
    case "MyCustomClass" {
      break;
    default:
      throw new ArgumentException("unsupported class type.");
  }

}

答案 3 :(得分:0)

你可以做这样的事情

object s1 = "TestString";
   var k = s1.GetType().ToString();
    switch(k)
    {
    case  "System.String":

        {
        Console.WriteLine("string");
             break;
        }
     //Add Other case also
    default:
        {
            Console.WriteLine("Not Sting");
            break;
        }
    }

答案 4 :(得分:0)

这里是一个完全不需要开关的示例:

        var typeBasedFunctionDictionary = new Dictionary<Type, Action>();
        typeBasedFunctionDictionary.Add(typeof(string), () => Console.WriteLine("string..."));
        typeBasedFunctionDictionary.Add(typeof(decimal), () => Console.WriteLine("decimal..."));
        typeBasedFunctionDictionary.Add(typeof(int), () => Console.WriteLine("int..."));

        //if (!typeBasedFunctionDictionary.ContainsKey(typeof(object)))
        //{
        //    throw (new InvalidOperationException("Type not supported..."));
        //}
        typeBasedFunctionDictionary["foo".GetType()]();
        typeBasedFunctionDictionary[10.2m.GetType()]();
        typeBasedFunctionDictionary[10.GetType()]();