【问题标题】:C# Generic: How to properly wrap methodC# Generic:如何正确包装方法
【发布时间】:2016-12-29 13:24:17
【问题描述】:

我是编程新手,我有一个关于 Generic 的问题。这是我的小程序的结构:

public enum FieldsA
{
    A,
    B,
    C
}

public enum FieldsB
{
    A,
    B,
    C
}

public abstract class Page
{

}

public abstract class BasePage<T> : Page where T : struct, IComparable
{
    public void Update()
    {
        // code
    }
}

public class ClassA : BasePage<FieldsA>
{

}

public class ClassB : BasePage<FieldsB>
{

}

public class MainClassA
{
    private ClassA _classA;

    public MainClassA(ClassA classA)
    {
        _classA = classA;
    }


    public void Method()
    {
        _classA.Update();            
    }
}

public class MainClassB
{
    private ClassB _classB;

    public MainClassB(ClassB classB)
    {
        _classB = classB;
    }

    public void Method()
    {
        _classB.Update();           
    }
}

我想问一下如何正确地创建一些静态方法,我在其中包装了Update() 方法。我试过这样的事情:

public static class Helper
{        
    public static void Update<T>(BasePage<T> page)
    {
        page.Update();
    }
}

并将Method() 中的内容替换为:

public class MainClassB
{
    private ClassB _classB;

    public MainClassB(ClassB classB)
    {
        _classB = classB;
    }

    public void Method()
    {
        Helper.Update(_classB);          
    }
}

(与MainClassA 相同)但它不起作用 -> 编译错误:类型 T 必须是不可为空的值类型才能将其用作泛型类型或方法 BasePage 中的参数 T。 感谢您的提示和帮助。

【问题讨论】:

  • 请比“它不起作用”更具体。你有没有编译错误?运行时异常?还有什么?
  • 我更新了。 public static void Update(BasePage page)中存在编译错误

标签: c# generics inheritance static


【解决方案1】:

你的问题是 where 语句:

public abstract class BasePage<T> : Page where T : struct, IComparable

你需要在你的静态类中有同样的东西

public static class Helper
{        
    public static void Update<T>(BasePage<T> page) where T : struct, IComparable
    {
        page.Update();
    }
}

因为BasePage&lt;T&gt; 需要它。

where T: class 也可能已经足够了,至少在 T 不以需要struct 或实现IComparable 接口的方式使用之前。

另请参阅该页面:https://msdn.microsoft.com/en-us/library/bb384067.aspx 这里有更多关于where 子句的信息

【讨论】:

    【解决方案2】:

    您正在尝试做的事情,在我看来很像 访问者模式

    当您查看该模式时,您可能会发现与您的示例代码有一些相似之处: BasePage&lt;T&gt; 将是具有两个具体实现 ClassAClassB 的抽象元素。 BasePage&lt;T&gt;.Update() 的公共接口很可能是 Visit() 方法。

    坚持使用 OO 中的设计模式可以让您专注于编写函数,而不必担心良好的类设计。它还可以使您免于一些麻烦,例如单元测试静态函数。 但是,在正确的情况下使用正确的模式。

    当您向下滚动 dofacotry 链接时,您可以找到一些 C# 示例实现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-12
      • 2020-04-05
      • 1970-01-01
      • 2016-12-23
      • 2020-09-10
      • 2017-06-15
      • 2014-08-29
      相关资源
      最近更新 更多