【问题标题】:Inheriting Generic Types继承泛型类型
【发布时间】:2018-09-27 08:47:21
【问题描述】:

假设

  1. 我已经知道框架不允许在示例中讨论模式
  2. 我需要从更简单的通用模式应用程序中受益。

上下文

我正在审查一个客户的代码,并确定了一些在多个类/结构中可靠实现的静态/实例方法。

我正在寻找一种类似于示例的方法,该方法将允许执行所描述的设计。

示例

public class StaticObject<T>: T where T: class, new(){
    public void Method1(){}
    public int Method2(){}
}

public class Object : StaticObject<KeyedCollection<string, object>>{

}

问题

我可以利用哪些替代方法来获得从 Generic T 继承类并公开两个静态方法的能力?

【问题讨论】:

  • 啊,我忽略了这个问题,你希望泛型类继承自它自己的泛型参数......所以我仍然不明白这意味着什么并用于实际生活。你能举一个现实生活中的例子吗?也许这是一个 xy 问题,您实际上尝试实现的目标有不同的方法。
  • 我想我可以有一个虚拟接口并针对该接口应用扩展
  • @GoldBishop - 我也在努力理解它的应用。如果我有一个StaticObject&lt;string&gt;,那么这两种方法必须使用反射才能看到T 实际上是string。它似乎首先否定了继承的价值。这种方法适用于哪些实际示例?
  • StaticObject&lt;string&gt;, StaticObject&lt;KeyedCollection&lt;string, object&gt;&gt;, StaticObject&lt;CustomClass&gt;....它将允许我定义一组通用方法,并且每个继承类都可以访问并相应地公开它们;同时为了目的从通用T 继承
  • 我不明白你在问什么,你的代码编译了一些小的更正dotnetfiddle.net/G0s77E

标签: .net generics inheritance .net-4.6.1


【解决方案1】:

好吧,也许你想要这样的东西。

using System;

public interface INeededForMethod1
{
    ...
}

public interface INeededForMethod2
{
    ...
}

public class GenericExtender<T>
{
    public T @Object { get; }
    private Func<T, INeededForMethod1> Method1Helper { get; }
    private Func<T, INeededForMethod2> Method2Helper { get; }

    public GenericExtender(
            Func<T> constructor,
            Func<T, INeededForMethod1> method1Helper,
            Func<T, INeededForMethod2> method2Helper)
   {
       this.Object = constructor();
       this.Method1Helper = method1Helper;
       this.Method2Helper = method2Helper;
   }

   public void Method1()
   {
       var method1Stuff = this.Method1Helper(this.@Object);
       ...
   }

   public void Method2()
   {
       var method2Stuff = this.Method2Helper(this.@Object);
       ...
   }        
}

细节很灵活,如果您需要来自T 的接口,您可以将其组合到GenericExtender&lt;T&gt; 的实现中。

【讨论】:

    猜你喜欢
    • 2015-09-15
    • 2021-10-11
    • 2018-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-11
    • 1970-01-01
    相关资源
    最近更新 更多