2016-06-21 2 views
1

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

У меня есть следующий код

public abstract class A 
{ 
    public int P1 {get; set;} 

} 

public class B : A 
{ 
    public int p2 {get; set;} 
} 

public class C : A 
{ 
    public int p2 {get; set;} 
} 


public class test 
{ 
A a = null; 

public test(A a1) 
{ 
    a = a1; 
} 

public void foo() 
{ 
    if((a as B)!=null) 
    { 
     (a as B).p2 = 1; 
    } 
    else if ((a as C)!=null) 
    { 
     (a as C).p2 = 2; 
    } 
} 

}

P2 doen't не существует в абстрактном классе только некоторые наследование класса будет иметь его. Для установки этого свойства мне нужно проверить, имеет ли текущий экземпляр тип Class B или C, и я установил свойство. Каждый раз, когда я добавлю класс, который имеет это свойство, мне нужно добавить чек для него. Есть ли способ только захватить экземпляр и проверить, существует ли P2, чем установить его, не проверяя каждый тип.

Благодаря

ответ

3

Некоторые варианты, ни один из которых являются идеальными:

Опции, которые не во время компиляции сейф:

  • использование отражения, чтобы увидеть, если объект имеет p2 свойство (и если это так)
  • использовать dynamic и обрабатывать любые исключения во время выполнения

Параметры, которые требуют изменений в классе дизайн

  • создать промежуточный тип, который наследуется от A и имеет p2 собственности и приведение к этому типу
  • определяют интерфейс с p2 свойства, что B и C как реализовать и попытаться применить к этому интерфейсу.
+0

, если Р2 является экземпляром другого класса, как, например, общественного ClassType P2 {получить, установить;} с помощью отражения, как вызвать метод из P2, как P2.F00() –

+0

Еогеаспа (VAR свойство в A.GetType () .GetProperties()) {if (property.Name == "p2") {property.Foo() ??? }} –

+0

Вам нужно будет получить значение из этого свойства и применить его к правильному типу, или использовать отражение и/или 'dynamic' _again_. –

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

  • Нет связанных вопросов^_^