Lançar um objeto para outro tipo
-
27-09-2019 - |
Pergunta
Eu tenho uma classe chamada A e One Classe B
public class A : UserControl { }
public class B : UserControl { }
Agora eu tenho uma montagem cuja função da classe aceita objetos da classe A. Esta montagem não é criada por mim, então não tenho nenhum controle. Basicamente, é a assembléia de terceiros.
Mas quero fornecer meus objetos da classe B, pois é um pouco personalizado. Tenha certeza de que ele contém todas as propriedades da classe A. Como posso digitar meu objeto de classe B para digitar A para que eu possa integrar a montagem de terceiros em meu projeto e personalizar a aparência de acordo com minhas necessidades?
Se eu fosse algo como (A)objB
Não é permitido. Então eu tentei o seguinte:
UserControl control = objB as UserControl;
A objA = control as A;
Mas o problema neste caso é Obja é nulo.
Para evitar confusão: a classe A e a montagem são fornecidas por 3ª parte.
Desde já, obrigado :)
Solução
Dada a sua hierarquia, você terá que escrever um operador de conversão. Não há uma maneira interna de fazer isso em geral (pense Dog : Animal
e Cat : Animal
):
public static explicit operator A(B b) {
// code to populate a new instance of A from b
}
Você também pode usar uma estrutura de reflexão genérica e fazer algo como
public static void PropertyCopyTo<TSource, TDesination>(
this TSource source,
TDestination destination
) {
// details elided
}
Então você poderia dizer
// b is B
// a is A
b.PropertyCopyTo<A>(a);
que copiariam todas as propriedades comuns entre b
para a
.
Outras dicas
Por B
ser fundível para um A
, B
devo herda A
. Ainda que B
contém todas as propriedades de A
, ainda não é um A
.
Você pode usar um padrão de adaptador
Se B não pode ser lançado para um (como em B is A
) Não é possível alcançar o que você está tentando fazer sem herdar de A. Infelizmente C# não suporta Digitação de pato Ao contrário de muitos idiomas dinâmicos (por exemplo, Ruby).
Você pode herdar da classe A:
public class B : A {
}
E se você precisar substituir alguns métodos/propriedades, basta defini -los como virtual
Na classe A.
Eu acho que você realmente não pode fazer isso.
Por que não adicionar suas propriedades a uma classe parcial?