C# Type.GetType不区分大小写-WinRT

C# Type.GetType不区分大小写-WinRT,c#,types,windows-runtime,case-insensitive,objectinstantiation,C#,Types,Windows Runtime,Case Insensitive,Objectinstantiation,在.NET 4.5中,Type.GetType可以不区分大小写。不幸的是,这在WinRT(Metro/Modern UI/Store应用程序)中不可用 是否有已知的解决方法?因为我必须从一个协议中实例化对象,该协议的所有字符串表示都是大写的 示例:从“MYOBJECT”开始,我必须实例化MYOBJECT 我目前使用的是Activator.CreateInstance(Type.GetType(“MYOBJECT”)),但由于区分大小写,它不起作用 谢谢您知道要从中加载类型的程序集吗?如果是这样,

在.NET 4.5中,
Type.GetType
可以不区分大小写。不幸的是,这在WinRT(Metro/Modern UI/Store应用程序)中不可用

是否有已知的解决方法?因为我必须从一个协议中实例化对象,该协议的所有字符串表示都是大写的

示例:从“MYOBJECT”开始,我必须实例化
MYOBJECT

我目前使用的是
Activator.CreateInstance(Type.GetType(“MYOBJECT”))
,但由于区分大小写,它不起作用


谢谢

您知道要从中加载类型的程序集吗?如果是这样,只需调用一次
Assembly.GetTypes()
,即可创建一个不区分大小写的
字典(使用
StringComparer.OrdinalIgnoreCase
)。那么您根本不需要使用
Type.GetType()
,只需查阅字典即可:

// You'd probably do this once and cache it, of course...
var typeMap = someAssembly.GetTypes()
                          .ToDictionary(t => t.FullName, t => t,
                                        StringComparer.OrdinalIgnoreCase);

...

Type type;
if (typeMap.TryGetValue(name, out type))
{
    ...
}
else
{
    // Type not found
}
编辑:看到这些名称空间都在同一名称空间中,您可以轻松筛选:

var typeMap = someAssembly.GetTypes()
                          .Where(t => t.Namespace == "Foo.Bar")
                          .ToDictionary(t => t.Name, t => t,
                                        StringComparer.OrdinalIgnoreCase);

您可以使用方法获取类型所在程序集中所有可能的类型,然后检查哪个类型大写与您的类型大写相等,然后在
GetType
方法中使用它。

考虑实际类名是
Car
,查询字符串是
Car
。由于它们在区分大小写方面有所不同,Type.GetType()将返回null。 要解决此问题,首先要过滤
Car
命名空间中的所有类(假定命名空间为
Vehicle

转换为
列表

List<Type> lstClasses = varClasses.ToList();
现在使用新字符串,使用Type.GetType()


@尼古拉斯·沃伦:为什么会很痛苦?到底有多少种类型,你要取多少?(我假设您通过名称获取了许多不同的类型。)嗯。。。完全误解了你的答案。很抱歉。这是一个很好的解决方案。您的编辑完全符合我的需要;)谢谢!
List<Type> lstClasses = varClasses.ToList();
string strActualName = "";
foreach (Type t in lstClasses )
{
     if (t.Name.ToLower() == "CAR".ToLower())
     {
           strActualName = t.Name;
           break;
     }
}
Type t1 = Type.GetType("Vehicles." + strActualName);