2009-10-05 7 views
0

Donc si la classe C a hérité de la classe B et possède une propriété supplémentaire, pourrais-je créer un nouvel objet de classe C en lui passant un objet qui existe déjà de classe B et laisser la propriété supplémentaire SQL pour voir ce que la propriété supplémentaire devrait être (comme pour un compteur, etc)?En C# pouvez-vous créer un nouvel objet hérité en lui affectant une copie de son objet de base?

C c = new C(); 
B b = bRepo.getBbyID(id); 
c = b; 
c.extraProperty = bRepo.getCountBybID(b.ID); 

Si cela pouvait fonctionner, pourrais-je faire la même chose avec un IQueryable de Cs et Bs?

Répondre

0

Vous ne pouvez pas faire cela comme vous l'avez spécifié. Pour obtenir le même résultat, vous pouvez copier toutes les propriétés de l'instance B vers l'instance C, puis définir la nouvelle propriété. Cependant, c'est souvent une indication que vous pourriez vouloir repenser votre modèle d'objet. Par exemple, vous pouvez avoir C avec un B et des propriétés supplémentaires au lieu de C étant un B. Cela a du sens pour quelque chose comme un compteur en tant que nouvelle propriété. Vous pouvez avoir une hiérarchie de classes comme ceci:

class B 
{ 
    string SomeValue1 { get; set; } 
    int SomeValue2 { get; set; } 
    decimal SomeValue3 { get; set; } 
} 

interface ICountable<T> 
{ 
    T Value { get; } 
    int Count { get; } 
} 

class C : ICountable<B> 
{ 
    B Value { get; set; } 
    int Count { get; set; } 
} 
3

No. A B n'est pas garanti d'être un C, de sorte que vous ne pouvez pas stocker B dans une variable qui ne peut contenir que Cs. (Un animal n'est pas garanti d'être un lama, donc vous ne pouvez pas créer un animal générique et le stocker dans une variable Llama.)

Cependant, vous pourriez fournir un moyen de construire une instance C à partir d'un B - soit en ayant la C copier les propriétés du B, ou en ayant le magasin C B en tant que parlementaire, et déléguer apporteurs de propriété et setters au contenue B. Ensuite, votre code ressemblerait à ceci:

B b = brepo.GetBById(id); 
C c = new C(b); 
c.extraProperty = brepo.GetCountByBId(b.Id); 

Le même problème s'applique avec un IQueryable de Bs. S'ils ne sont pas en réalité Cs, vous ne pouvez pas prétendre qu'ils le sont, ne leur attribuez pas de propriété extraProperty. Ce que vous pouvez faire est de sélectionner ceux qui sont Cs en utilisant l'opérateur OfType, essayer de les convertir en C en utilisant l'opérateur Cast, ou créer de nouveaux C à partir des Bs interrogés en utilisant l'opérateur Select et l'une des techniques mentionnées ci-dessus, par ex. bs.Select(b => new C(b)).

Questions connexes