2016-04-11 4 views
1
public DerivedClass : BaseClass 
{ 
    // code 
} 

DerivedClass B = (DerivedClass)MethodReturnsBaseClassObject(); 
B.DoWork(); 

Существует много классов Derived, унаследованных от BaseClass. Поэтому каждый раз мне нужно написать новый метод для использования некоторых свойств.Тип класса с производным классом динамически до базового класса C#

Возможно ли это, используя отражение, мы делаем DerivedClass типа динамического и делаем что-то подобное и делаем его общим.

System.Type type = GetRequestFromSession().GetType(); 
type B = (type)MethodReturnsBaseClassObject(); 
Console.WriteLine(B.Name); 
Console.WriteLine(B.Age); 

всякая помощь приветствуется.

+0

Рассматривались ли вы динамические типы: https://msdn.microsoft.com/en-us/library/dd264736.aspx или ExpandoObject https://msdn.microsoft.com/en-us/library/system.dynamic. expandoobject (v = vs.110) .aspx? Вот также блог msdn на эту тему: https://blogs.msdn.microsoft.com/csharpfaq/2009/09/30/dynamic-in-c-4-0-introducing-the-expandoobject/ –

+0

Я предполагаю, что вы can't просто объявить 'Name' и' Age' на 'BaseClass', не так ли? – HimBromBeere

ответ

3

Это кажется плохим дизайном для меня: вы делаете нечто общее, что используете как нечто, что нет. Возможно, вы должны пересмотреть свой дизайн.

Для чего ваш вопрос, возможно, вы можете создать прокси-метод или класс, который возвращает ожидаемый тип. Это полезно, когда есть небольшое количество методов, которые вы вызываете.

Другой вариант заключается в использовании ключевого слова dynamic, но я бы посоветовал использовать его только в том случае, если ничего не работает.

+0

Я знаю его очень плохой дизайн. Но мне нужно сделать его общим. Есть 34 одинаковых метода, написанных в любом приложении. Я хочу сделать один метод для лучшего обслуживания в будущем –

+0

Спасибо Патрику. Использование динамика с этим дизайном действительно исправить ... Но жаль, что плохой дизайн я недавно работаю над этим приложением. –

4

Вы можете иметь безопасный доступ к членам производного типа (без слепков) при обеспечении базового класса ограничения, если вы используете общий метод со следующей подписью:

public TDerived MethodReturnsDerivedObject<TDerived>() 
    where TDerived : BaseClass 

Ваши звонки будут выглядеть следующим образом :

DerivedClass b = MethodReturnsDerivedObject<DerviedClass>(); 

b.ExecuteSomeMethodDefinedInBaseClass(); 

Console.WriteLine(b.SomePropertyDefinedInDerivedClass); 
+0

Это лучше, чем использование динамической IMO. – moarboilerplate

+0

Да, это похоже на использование дженериков. – Magnus

+0

Это будет общая реализация для многих производных типов. Я использовал динамический, потому что с помощью 'dynamic' я не буду менять свой дизайн. Но для этого мне придется сначала знать тип производного класса. –

2

Я бы поехал с ответом Кирилла Шленского. Но я также хотел бы предложить переместить этот метод на базовый класс , если имеет смысл сделать это. Там могут быть запутанные зависимости или другие странности, которые запрещают это решение, но также могут позволить вам иметь одного потребителя без использования дженериков.

Смежные вопросы