Распаковка типа объекта в примитив и другие типы (имитация позднего связывания)
Вопрос
У меня есть класс, который содержит элементы типа 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
В том смысле, что он будет работать правильно, нет ничего плохого.Однако, похоже, это не добавляет никакой ценности вашему приложению по сравнению с неуниверсальным приложением, которое принимает параметр объекта.