Unboxing um tipo de objecto a uma primitiva e outros tipos (simulando a ligação tardia)

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

  •  03-07-2019
  •  | 
  •  

Pergunta

Eu tenho uma classe que contém Append-like membros para cada tipo primitivo, corda e 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){}
    }

A partir de uma classe diferente, quero chamar esse método "genericamente por assim dizer", passando objeto

dizer que tenho algo assim:

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);
    }
}

Pergunta # 1: Will pair.Value ser unboxed a uma primitiva correto? s

Pergunta # 2:? Qualquer problesm com função membro AddParam

Graças

Foi útil?

Solução

No.

Com o código como está, ele vai deixar de compilar porque não há nenhuma conversão adequada do objeto -> não-objeto tipo. Você terá que converter manualmente o código para o tipo apropriado.

Uma opção é fornecer uma sobrecarga de Append do tipo Object e fazer a lógica lá.

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

Editar Pergunta nº 2

Não há nada de errado no sentido de que ele funcionará corretamente. No entanto, não parecem acrescentar qualquer valor para a sua aplicação sobre ter um não-genéricos que leva um parâmetro de objeto.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top