如果我希望用语法重写我的代码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.");
}
}
答案 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()]();