2012-04-18 2 views
0

Это моя проблема (пожалуйста, несите меня здесь).Как получить общий интерфейс, не зная его конкретного типа?

У меня есть следующий базовый класс и интерфейс

public abstract class Entity 
{ 
    public Entity() 
    { 
    } 
} 

public interface IRelatable<T> where T : Entity 
{ 
    T RelatedEntity { get; set; } 

    void RelateTo() 
} 

У меня есть два класса, которые наследуются от Entity:

public class E1 : Entity 
{ 
    public E1 
    { 
    } 
} 


public class E2 : Entity, IRelatable<E1> 
{ 
    public E2 
    { 
    } 

    public E1 RelatedEntity { get; set; } 

    public void RelateTo() 
    { 
     // To some code here .... 
    }  
} 

Теперь я хочу, чтобы получить RelatedEntity Е2, что-то вроде этого:

public void DoReflcetion(Entity ent) 
{ 
    var ent2 = (ent as IRelatable<>).RelatedEntity; 
} 

Любые идеи, как это сделать?

Спасибо, Омри


А. Спасибо за ваш ответ. B. Проблема заключается в том, что я хочу, чтобы получить доступ к RelatedEntity из необщего класса, как это:

public class SomeClass 
{ 
    public void DoSomething(IRelatable<> rel) 
    { 
     rel.RelateTo(); 
    } 
} 

ответ

0

Если вы хотите получить доступ к RelatedEntity из необщего класса, а затем создать общий метод

public class SomeClass 
{ 
    public void DoSomething<T>(IRelatable<T> rel) 
     where T : Entity 
    { 
     T relatedTo = rel.RelatedEntity; 
     // ...   
    } 
} 

Тип T будет выведен из типа аргумента:

SomeClass someClass = new SomeClass(); 
E2 e2 = new E2() { RelatedEntity = new E1() }; 
s.DoSomething(e2); 
0

Вы можете сделать что-то вроде этого:

public class SomeClass<T> where T: Entity 
{ 
    public void DoSomething(IRelatable<T> rel) 
    { 
     T relatedTo = rel.RelatedEntity; 
     // ... 
    } 
} 

Хотя я бы рекомендовал использовать более простую модель для представления отношений между объектами.

+0

А. Спасибо за ваши ответ. B. Проблема заключается в том, что я хочу, чтобы получить доступ к RelatedEntity из необщего класса, как это: 'Открытый класс SomeClass { общественного недействительными DoSomething (IRelatable <> отн) { rel.RelateTo(); } } ' –

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