Type.GetType нечувствителен к регистру — WinRT

Из документации Microsoft Type.GetType может быть нечувствительным к регистру в .NET 4.5. К сожалению, это недоступно в WinRT (приложения Metro/Modern UI/Store).

Есть ли известный обходной путь? Потому что мне нужно создавать экземпляры объектов из протокола, у которых все строковые представления в верхнем регистре.

Пример: из "MYOBJECT" я должен создать экземпляр MyObject.

В настоящее время я использую Activator.CreateInstance(Type.GetType("MYOBJECT")), но из-за чувствительности к регистру он не работает.

Спасибо


person Nicolas Voron    schedule 26.10.2012    source источник


Ответы (3)


Знаете ли вы сборку, из которой вы загружаете типы? Если это так, вы можете просто создать Dictionary<string, Type> без учета регистра (используя StringComparer.OrdinalIgnoreCase), вызвав Assembly.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);
person Jon Skeet    schedule 26.10.2012
comment
@NicolasVoron: Почему это должно быть больно? Сколько типов есть, и сколько вы получаете? (Я предполагал, что вы выбираете много разных типов по имени.) - person Jon Skeet; 26.10.2012
comment
Хммм ... Совершенно неправильно понял ваш ответ. Извини за это. Это очень хорошее решение. Ваше редактирование идеально подходит для моих нужд ;) Большое спасибо! - person Nicolas Voron; 26.10.2012

Вы можете использовать метод GetTypes() для получения всех возможных типов в сборке. где находится ваш тип, после этого проверьте, какой тип в верхнем регистре соответствует верхнему регистру вашего типа, а затем используйте его в методе GetType.

person Saeed Amiri    schedule 26.10.2012

Учтите, что ваше фактическое имя класса — 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);
person Sarath KS    schedule 03.11.2014