Подтвердить что ты не робот

Переключить PropertyType

Как я могу сделать эту работу?

switch(property.PropertyType){
    case typeof(Boolean): 
        //doStuff
        break;
    case typeof(String): 
        //doOtherStuff
        break;
    default: break;
}

Я не хочу использовать это имя, потому что сравнение строк для типов просто ужасно и может быть изменено.

4b9b3361

Ответ 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) сериализация должна соответствовать некоторым устаревшим правилам