将特定类型映射到Func <t> </t>

时间:2014-07-29 12:38:14

标签: c#-4.0 generics

将特定类型映射到TResult的Func的最佳方法是什么?例如:

ViewModelBase GetScreen(Type type)
{
    // mapping code here
}

ScreenA GetScreenA()
{
   // returns new instance of ScreenA
}

// usage
var screen = GetScreen(typeof(ScreenA));

我需要做的是将ScreenA类型映射到GetScreenA()方法(强类型)。每个屏幕都继承自ViewModelBase。实现这一目标的最佳方法是什么?我不是在考虑一堆ifs作为解决方案。

if (type = typeof(ScreenA))
    return GetScreenA();
else if ....

2 个答案:

答案 0 :(得分:0)

您可以使用字典映射到不同的操作,而不是使用if语句。

private Dictionary<Type , Func<ViewModelBase>> Method2ObjectMap 
= new Dictionary<Type , Func<ViewModelBase>>
{ 
{ ScreenA, GetScreenA },
{ ScreenB, GetScreenB },
{ ScreenC, GetScreenC } 
};

然后用类似的东西来打电话:

if(Method2ObjectMap.ContainsKey(ScreenB))
{
    return Method2ObjectMap[ScreenB];
}

答案 1 :(得分:0)

这样的事情会帮助你

class TypeA
{
}

class TypeB:TypeA
{
}

class TypeC : TypeA
{
}

private static Dictionary<Type, Func<TypeA>> ScreenMap = 
     new Dictionary<Type, Func<TypeA>>
{           
        {typeof(TypeA),()=> new TypeA() },
        {typeof(TypeB) ,()=> new TypeB()  },
        {typeof(TypeC),()=> new TypeC() }

};

并使用它

 TypeA a= ScreenMap[typeof(TypeA)]();