Переключить PropertyType
Как я могу сделать эту работу?
switch(property.PropertyType){
case typeof(Boolean):
//doStuff
break;
case typeof(String):
//doOtherStuff
break;
default: break;
}
Я не хочу использовать это имя, потому что сравнение строк для типов просто ужасно и может быть изменено.
Ответы
Ответ 1
System.Type propertyType = typeof(Boolean);
System.TypeCode typeCode = Type.GetTypeCode(propertyType);
switch (typeCode)
{
case TypeCode.Boolean:
//doStuff
break;
case TypeCode.String:
//doOtherStuff
break;
default: break;
}
Вы можете использовать гибридный подход для TypeCode.Object, где вы динамически, если с typeof. Это очень быстро, потому что для первой части - коммутатор - компилятор может решить на основе таблицы поиска.
Ответ 2
Вы не можете. Вы можете создать сопоставление между типами и делегатом, используя словарь:
var TypeMapping = new Dictionary<Type, Action<string>>(){
{typeof(string), (x)=>Console.WriteLine("string")},
{typeof(bool), (x)=>Console.WriteLine("bool")}
};
string s = "my string";
TypeMapping[s.GetType()]("foo");
TypeMapping[true.GetType()]("true");
Ответ 3
Я думаю, что вы ищете здесь хорошую карту. Используя делегаты и общий IDictionary, вы можете делать то, что хотите.
Попробуйте что-то вроде этого:
private delegate object MyDelegate();
private IDictionary<Type, MyDelegate> functionMap = new IDictionary<Type, MyDelegate>();
public Init()
{
functionMap.Add(typeof(String), someFunction);
functionMap.Add(tyepof(Boolean), someOtherFunction);
}
public T doStuff<T>(Type someType)
{
return (T)functionMap[someType]();
}
Ответ 4
Вы не можете сделать это с помощью переключателя в С#, поскольку регистр должен быть постоянным.
Что не так:
if(property.PropertyType == typeof(bool)) {
//dostuff;
}
else if (property.PropertyType == typeof(string)) {
//do other stuff;
}
Ответ 5
Я лично предпочитаю подход Dictionary<Type, other>
больше всего... Я могу даже представить вам еще один пример: http://www.timvw.be/presenting-namevaluecollectionhelper/
Если вы настаиваете на написании оператора switch-case, вы можете использовать имя типа...
switch (blah.PropertyType.FullName)
{
case typeof(int).FullName: break;
case typeof(string).FullName: break;
}
Ответ 6
С# 7.0 будет поддерживать типы переключателей как часть более крупной функции сопоставления шаблонов.
Этот пример взят из . Сообщение в блоге NET, в котором объявлены новые функции:
switch(shape)
{
case Circle c:
WriteLine($"circle with radius {c.Radius}");
break;
case Rectangle s when (s.Length == s.Height):
WriteLine($"{s.Length} x {s.Height} square");
break;
case Rectangle r:
WriteLine($"{r.Length} x {r.Height} rectangle");
break;
default:
WriteLine("<unknown shape>");
break;
case null:
throw new ArgumentNullException(nameof(shape));
}
Ответ 7
Не беспокойтесь об использовании строк в коммутаторе, потому что если у вас есть несколько компиляторов, они автоматически преобразуют их в хэш-поиск, обеспечивая достойную производительность, несмотря на то, что он выглядит довольно сильным.
Проблема изменения типов строк может быть решена путем включения в явный хэш-поиск и заполнения констант хэша в статическом конструкторе. Таким образом, хэш заполняется правильными строками во время выполнения, поэтому они остаются правильными.
Ответ 8
Просто используйте обычный шаблон if/else if/else:
if (property.PropertyType == typeof(Boolean))
{
}
else if (property.PropertyType == typeof(String))
{
}
else if (...)
{
}
Ответ 9
Мне недавно приходилось делать что-то подобное, и использование переключателя не было вариантом. Выполнение символа == на typeof (x) отлично, но более элегантным способом могло бы быть что-то вроде этого:
if(property.PropertyType is bool){
//dostuff;
}
else if (property.PropertyType is string){
//do other stuff;
}
Но я не уверен, что вы можете использовать ключевое слово "is" таким образом, я думаю, что он работает только для объектов...
Ответ 10
О stringmatching: это был один из вопросов в вопросе, чтобы не делать это через stringmatching.
Словарь - это подход, который я буду использовать, когда я поместил весь этот алгоритм сериализации в свою собственную библиотеку.
На данный момент я сначала попробую typeCode, так как мой случай использует только базовые типы.
Если это не сработает, я вернусь к рою if/elses: S
Прежде чем ppl спросит меня, почему я хочу свою собственную сериализацию:
1).net xml serialization не сериализует свойства без сеттеров
2) сериализация должна соответствовать некоторым устаревшим правилам