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 :)

Foi útil?

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

Veja aqui

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?

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