【问题标题】:public static (const) in a generic .NET class通用 .NET 类中的公共静态 (const)
【发布时间】:2023-03-08 13:01:01
【问题描述】:

是否有语法技巧可以在不指定(ad-hoc)类型的情况下获取泛型类中的常量?

public class MyClass<T>{
    public const string MyConstant = "fortytwo";
}

// I try to avoid this type specification.
var doeswork = MyClass<object>.MyConstant;  

// Syntax similar to what I'd like to accomplish.
var doesnotwork = MyClass.MyConstant;  

关于静态变量(常量)未在 MyClass&lt;object&gt;MyClass&lt;int&gt; 等不同类型之间共享有一个警告,但我的问题是关于可能的可用语法技巧。

【问题讨论】:

  • 你可以为常量创建一个非泛型类MyClass
  • 警告:在公共类中使用const 可能会导致头疼如果程序集将在另一个程序或程序集中引用。请改用readonly
  • 这是@B0Andrew 的警告reference

标签: c# .net generics syntax


【解决方案1】:

使用非泛型抽象父类。

public abstract class MyClass
{
   public const string MyConstant = "fortytwo";
}

public class MyClass<T> : MyClass
{
   // stuff
}

var doeswork = MyClass.MyConstant; 

这当然假设常量需要成为泛型类的一部分是有某些原因的;如果它具有公共可访问性,我看不出你为什么不把它放在一个单独的类中。

拥有一个非泛型抽象父类对于您创建的每一个泛型类都是一个好主意;泛型类实际上是特定子类型类的模板,而不是真正的父类,因此拥有一个真正的非泛型父类可以使某些技术(例如但当然不限于这个)变得容易得多。

【讨论】:

  • @MatthewWatson 是的,也许 30 秒。 :p
  • 我检查这个作为答案的原因是它很短(=可读)并且解决了我的问题。感谢@MatthewWatson 付出的努力和时间。
  • MyClass.MyConstant 不会编译,因为没有 MyClass 类。
  • @Rawling 已修复。其他人在有问题的doeswork 行中进行了编辑,但我批准了该编辑,但没有仔细查看,所以这是我的责任。
  • 遗憾的是,如果您的类扩展了另一个通用基类并且您需要将 T 传递给您的基类,则此解决方案不再适用。
【解决方案2】:

这样的工作:

using System;

namespace Demo
{
    public class MyClass // Use a non-generic base class for the non-generic bits.
    {
        public const string MyConstant = "fortytwo";

        public static string MyString()
        {
            return MyConstant;
        }
    }

    public class MyClass<T>: MyClass // Derive the generic class
    {                                // from the non-generic one.
        public void Test(T item)
        {
            Console.WriteLine(MyConstant);
            Console.WriteLine(item);
        }
    }

    public static class Program
    {
        private static void Main()
        {
            Console.WriteLine(MyClass.MyConstant);
            Console.WriteLine(MyClass.MyString());
        }
    }
}

此方法适用于您要提供的不依赖于类型参数的任何静态类型或值。它也适用于静态方法。

(注意:如果您不希望任何人实例化基类,请将其设为抽象。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    • 2011-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多