【问题标题】:Get implementer class instance from the interface instance从接口实例中获取实现类实例
【发布时间】:2013-04-04 20:17:22
【问题描述】:

我有一些实现接口的类:

class FirstImplementer : IInterface { ... }
class AnotherImplementer : IInterface { ... }

在代码的某处,我得到了 IInterface 实例的列表。

List<IInterface> MyList;

我想知道每个 IInterface 实例的具体实例的实现类是什么(FirstImplementer 或 AnotherImplementer)。

【问题讨论】:

    标签: c# reflection interface


    【解决方案1】:

    您可以在MyList 中的实例上使用.GetType() 并从那里开始。

    MyList[0].GetType() > 这与typeof(FirstImplementer) 等人相同。

    【讨论】:

      【解决方案2】:
      foreach (var item in MyList)
      {
          var theType = item.GetType();
          // why did you want theType, again?
          // you generally shouldn't be concerned with how your interface is implemented
      }
      

      此替代方法可能更有用,具体取决于您要执行的操作:

      foreach (var item in MyList)
      {
          if (item is FirstImplementer)
          {
              var firstImpl = (FirstImplementer)item;
              // do something with firstImpl
          }
          else if (item is AnotherImplementer)
          {
              var anotherImpl = (AnotherImplementer)item;
              // do something with anotherImpl
          }
      }
      

      在可能有意义的情况下,通常最好使用isas 而非反射(例如GetType)。

      【讨论】:

      • 它比这更深入一点。在具体情况下,implementer 是Implementer&lt;T&gt;,接口用于省略类型参数,这样我就可以遍历许多不同类型的实例。此时我想从列表中的每个获取类型参数并打印出来。
      • @Daniel 我已经用替代方案更新了我的解决方案。如果你不需要反思,你应该避免它。
      【解决方案3】:
      foreach (var instance in MyList)
      {
          Type implementation = instance.GetType ();
      }
      

      【讨论】:

        【解决方案4】:

        如果您需要获取第一个类型参数(如果有),如果列表中的每个实例甚至不存在此类类型参数,则为 null,在设计时您在语法上将其观察为接口引用,那么您可以使用 GetGenericArguments 方法输入类型。

        这里有一个小辅助方法,它需要一堆对象 这可能是空的,但如果它们不是,它肯定会实现你的接口 (他们会有一个运行时类型)并产生一堆类型 以 SomeImplementer 模式表示(按相应顺序)发现的类型参数:

        public IEnumerable<Type> GetTypeArgumentsFrom(IEnumerable<IInterface> objects) {
            foreach (var obj in objects) {
                if (null == obj) {
                    yield return null; // just a convention 
                                       // you return null if the object was null
                    continue;
                }
        
                var type = obj.GetType();
                if (!type.IsGenericType) {
                    yield return null;
                    continue;
                }
        
                yield return type.GetGenericArguments()[0];
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-08-18
          • 1970-01-01
          • 2013-06-05
          • 2016-09-30
          • 1970-01-01
          相关资源
          最近更新 更多