C# Type.GetType不区分大小写-WinRT
在.NET 4.5中,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”)),但由于区分大小写,它不起作用 谢谢您知道要从中加载类型的程序集吗?如果是这样,
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);