6

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

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

示例:从“MYOBJECT”,我必须实例化MyObject.

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

谢谢

4

3 回答 3

7

您知道要从中加载类型的程序集吗?如果是这样,您可以通过调用一次来创建不区分大小写的Dictionary<string, Type>(使用)。然后你根本不需要使用- 只需查阅字典:StringComparer.OrdinalIgnoreCaseAssembly.GetTypes()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);
于 2012-10-26T14:33:21.450 回答
4

您可以使用GetTypes()方法来获取您的类型所在的程序集中的所有可能类型,然后检查哪种类型大写等于您的类型大写,然后在GetType方法中使用它。

于 2012-10-26T14:33:52.210 回答
1

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

var varClasses = from t in Assembly.GetExecutingAssembly().GetTypes()
                 where t.IsClass && t.Namespace == "Vehicles"
                 select t;

转换为List

List<Type> lstClasses = varClasses.ToList();

声明一个变量以获取类的实际名称,并使用循环来比较字符串,不区分大小写。

string strActualName = "";
foreach (Type t in lstClasses )
{
     if (t.Name.ToLower() == "CAR".ToLower())
     {
           strActualName = t.Name;
           break;
     }
}

现在使用新字符串,使用 Type.GetType()

Type t1 = Type.GetType("Vehicles." + strActualName);
于 2014-11-03T08:48:46.123 回答