Распаковка типа объекта в примитив и другие типы (имитация позднего связывания)

StackOverflow https://stackoverflow.com/questions/607668

  •  03-07-2019
  •  | 
  •  

Вопрос

У меня есть класс, который содержит элементы типа Append для каждого примитивного типа, строки и INetSerializable:

   public class TypeAppender
   {
         public void Append(int i ) {}
         public void Append(double d) {}
         public void Append(string s){}i){}
         public void Append(INetSerializable ins){}
    }

Из другого класса я хочу вызвать этот метод «в общем, так сказать», передав Object

скажем, у меня есть что-то вроде этого:

class SomeClientClass
{
    TypeAppender _appender=new TypeAppender ();  
    Dictionary<string, Object> _cmdTable =new Dictionary<string, Object>();   

    public void Process()
    {   
        foreach(KeyValuePair<string, Object> pair in cmdTable )   
        {
              _appender.Append(pair.Key);

              Object obj = pair.Value;
              if (obj is int)
                 _appender..Append((int)obj);
              else if (obj is double)
                 _appender..Append((double)obj);
              else if (obj is char)
                 _appender..Append((char)obj);
              else if (obj is string)
                 _appender..Append((string)obj); 
        }
    }     
    public void AddParam<T>(string key, T value)
    {
            _cmdTable.Add(key, value);
    }
}

Вопрос 1: Будет ли пара.Value распакована в правильный примитив?с

Вопрос 2: Есть ли проблемы с функцией-членом AddParam?

Спасибо

Это было полезно?

Решение

Нет.

С кодом в том виде, в котором он есть, его не удастся скомпилировать, поскольку нет подходящего преобразования из типа объект -> необъектный тип.Вам придется вручную преобразовать код в соответствующий тип.

Один из вариантов — предоставить перегрузку Append типа Object и реализовать там логику.

void Append(object obj) {
  if ( obj is int ) {
    Append((int)obj);
  } else if ( obj is double) { 
    Append((double)obj);
  ...
}

РЕДАКТИРОВАТЬ Вопрос 2

В том смысле, что он будет работать правильно, нет ничего плохого.Однако, похоже, это не добавляет никакой ценности вашему приложению по сравнению с неуниверсальным приложением, которое принимает параметр объекта.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top