2015-06-25 5 views
-1

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

Class A 
{ 
    public int data; 
} 

Class B : Class A { } 

Class C : Class A { } 

Class D : Class A { } 

. 
. 
. 

Class G<T> 
{ 
    T field 
} 

main() 
{ 
    object t = CallOuterService(); 
} 

при условии, что т является экземпляр G экземпляра с одним из классов, вытекающих, есть способ доступа поля данных, не пытаясь бросить ко всем классам, происходящими?

* отредактировано - 1. поле данных является общедоступным 2. классы A, B, C ... G не обрабатываются моим кодом, все они являются интерфейсами с внешней службой. Я не могу изменить их в любом случае ...

+0

просто используйте 'public int data'', что возвращает' CallOuterService' и почему вы его назначаете ' object'? – Grundy

+3

Это действительно помогло бы, если бы вы показали короткую, но полную программу, демонстрирующую проблему, а не просто псевдокод. –

+0

_classes A, B, C ... G не обрабатываются моим кодом, все они являются интерфейсами с внешней службой. Это классы или интерфейсы? – Grundy

ответ

1

Через covariance вы можете:

class A 
{ 
    public int data; 
} 

class B : A { } 

class C : A { } 

class D : A { } 

interface IG<out T> 
{ 
    T field { get; } 
} 

class G<T> : IG<T> 
{ 
    public T field { get; set; } 
} 

, а затем:

G<D> gd = new G<D> { field = new D { data = 5 } }; 

IG<A> ga = gd; 
int data = ga.field.data; // 5 

Обратите внимание, что вы можете только читать field недвижимость, не писать Это! И ковариация предназначена только для интерфейсов (по этой причине мне пришлось определить интерфейс IG<T> и использовать его для доступа к свойству field)

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