通用.NET类中的public static(const)

时间:2015-01-08 14:02:35

标签: c# .net generics syntax

是否有语法技巧可以在不指定(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<object>MyClass<int>等不同类型之间共享,有一个警告,但我的问题是关于可能的语法技巧。

2 个答案:

答案 0 :(得分:12)

使用非通用抽象父类。

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

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

var doeswork = MyClass.MyConstant; 

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

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

答案 1 :(得分:5)

这样的工作:

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());
        }
    }
}

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

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