【问题标题】:How to get a generic interface without knowing its specific type?如何在不知道其具体类型的情况下获得通用接口?
【发布时间】:2012-04-18 11:21:02
【问题描述】:

这是我的问题(请耐心等待)。

我有以下基类和接口

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 ....
    }    
}

现在,我想获取 E2 的相关实体,如下所示:

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

任何想法如何做到这一点?

谢谢, 暗里


A.谢谢您的回答。 B. 问题是我想从这样的非泛型类中访问 RelatedEntity:

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

【问题讨论】:

    标签: c# generics reflection interface


    【解决方案1】:

    如果你想从非泛型类中访问 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);
    

    【讨论】:

      【解决方案2】:

      你可以这样做:

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

      虽然我建议使用更简单的模型来表示实体之间的关系。

      【讨论】:

      • A.谢谢您的回答。 B. 问题是我想从这样的非泛型类访问 RelatedEntity:public class SomeClass { public void DoSomething(IRelatable&lt;&gt; rel) { rel.RelateTo(); } }
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多