Converter class base para class derivada

É possível em C # converter explicitamente um object de class base em uma de suas classs derivadas? Atualmente pensando que tenho que criar um construtor para minhas classs derivadas que aceitam um object de class base como um parâmetro e copiam os valores da propriedade. Eu realmente não gosto dessa idéia, então eu gostaria de evitar isso, se possível.

Isso não parece que deveria funcionar (object é instanciado como nova base, portanto, a memory não deve ser alocada para membros extras da class derivada), mas o C # parece permitir que eu faça isso:

class BaseClass { ... some stuff ... } class DerivedClass : BaseClass { public bool MyDerivedProperty{ get; set; } } static void Main(string[] args) { BaseClass myBaseObject = new BaseClass(); DerivedClass myDerivedObject = myBaseObject as DerivedClass; myDerivedObject.MyDerivedProperty = true; } 

Não, não há uma maneira integrada de converter uma turma como você diz. A maneira mais simples de fazer isso seria fazer o que você sugeriu: criar um construtor DerivedClass(BaseClass) . Outras opções viriam basicamente para automatizar a cópia de propriedades da base para a instância derivada, por exemplo, usando reflection.

O código que você postou usando as irá compilar, como eu tenho certeza que você viu, mas lançará uma exceção de referência nula ao executá-lo, porque myBaseObject as DerivedClass será avaliado como null , já que não é uma instância de DerivedClass .

Isso não é possível. mas você pode usar um mapeador de objects como o AutoMapper

Exemplo:

 class A { public int IntProp { get; set; } } class B { public int IntProp { get; set; } public string StrProp { get; set; } } 

No global.asax ou boot do aplicativo:

 AutoMapper.Mapper.CreateMap(); 

Uso:

 var b = AutoMapper.Mapper.Map(a); 

É facilmente configurável por meio de uma API fluente.

Eu encontrei uma solução para isso, não dizendo que é o melhor, mas parece limpo para mim e não requer grandes alterações no meu código. Meu código parecia semelhante ao seu até que percebi que não funcionava.

Minha class base

 public class MyBaseClass { public string BaseProperty1 { get; set; } public string BaseProperty2 { get; set; } public string BaseProperty3 { get; set; } public string BaseProperty4 { get; set; } public string BaseProperty5 { get; set; } } 

Minha class derivada

 public class MyDerivedClass : MyBaseClass { public string DerivedProperty1 { get; set; } public string DerivedProperty2 { get; set; } public string DerivedProperty3 { get; set; } } 

Método anterior para obter uma class base preenchida

 public MyBaseClass GetPopulatedBaseClass() { var myBaseClass = new MyBaseClass(); myBaseClass.BaseProperty1 = "Something" myBaseClass.BaseProperty2 = "Something else" myBaseClass.BaseProperty3 = "Something more" //etc... return myBaseClass; } 

Antes eu estava tentando isso, o que me deu uma incapacidade de lançar erro

 public MyDerivedClass GetPopulatedDerivedClass() { var newDerivedClass = (MyDerivedClass)GetPopulatedBaseClass(); newDerivedClass.UniqueProperty1 = "Some One"; newDerivedClass.UniqueProperty2 = "Some Thing"; newDerivedClass.UniqueProperty3 = "Some Thing Else"; return newDerivedClass; } 

Eu mudei meu código como segue abaixo e parece funcionar e faz mais sentido agora:

Velho

 public MyBaseClass GetPopulatedBaseClass() { var myBaseClass = new MyBaseClass(); myBaseClass.BaseProperty1 = "Something" myBaseClass.BaseProperty2 = "Something else" myBaseClass.BaseProperty3 = "Something more" //etc... return myBaseClass; } 

Novo

 public void FillBaseClass(MyBaseClass myBaseClass) { myBaseClass.BaseProperty1 = "Something" myBaseClass.BaseProperty2 = "Something else" myBaseClass.BaseProperty3 = "Something more" //etc... } 

Velho

 public MyDerivedClass GetPopulatedDerivedClass() { var newDerivedClass = (MyDerivedClass)GetPopulatedBaseClass(); newDerivedClass.UniqueProperty1 = "Some One"; newDerivedClass.UniqueProperty2 = "Some Thing"; newDerivedClass.UniqueProperty3 = "Some Thing Else"; return newDerivedClass; } 

Novo

 public MyDerivedClass GetPopulatedDerivedClass() { var newDerivedClass = new MyDerivedClass(); FillBaseClass(newDerivedClass); newDerivedClass.UniqueProperty1 = "Some One"; newDerivedClass.UniqueProperty2 = "Some Thing"; newDerivedClass.UniqueProperty3 = "Some Thing Else"; return newDerivedClass; } 

Você pode implementar a conversão você mesmo, mas eu não recomendaria isso. Dê uma olhada no Decorator Pattern se você quiser fazer isso para estender a funcionalidade de um object existente.

Não, não é possível. A única maneira que é possível é

 static void Main(string[] args) { BaseClass myBaseObject = new DerivedClass(); DerivedClass myDerivedObject = myBaseObject as DerivedClass; myDerivedObject.MyDerivedProperty = true; } 

Não, não há conversão interna para isso. Você precisará criar um construtor, como você mencionou, ou algum outro método de conversão.

Além disso, como BaseClass não é uma DerivedClass, myDerivedObject será nulo e a última linha acima lançará uma exceção de referência nula.