2015-01-08 4 views
6

Есть ли синтаксический трюк, чтобы получить константу в родовом классе без указания типа (ad-hoc)?public static (const) в общем классе .NET

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

Вы можете создать не-универсальный класс 'MyClass' для константы. – Dirk

+1

ПРЕДУПРЕЖДЕНИЕ. Использование 'const' в общедоступных классах может вызвать головные боли **, если ** сборка будет указана в другой программе или сборке. Вместо этого используйте 'readonly'. – B0Andrew

+3

Вот [ссылка] (http://www.stum.de/2009/01/14/const-strings-a-very-convenient-way-to-shoot-yourself-in-the-foot/) для @ Предупреждение B0Andrew – stuartd

ответ

10

Используйте неоригинальный абстрактный родительский класс.

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

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

var doeswork = MyClass.MyConstant; 

Это, конечно, предполагает, что есть какая-то причина, по которой постоянные потребности быть частью общего класса; если он имеет общедоступную доступность, я не вижу причины, по которой вы не просто поместили бы ее в отдельный класс.

Наличие неосновного абстрактного родительского класса - хорошая идея для каждые генерируемый класс; общий класс на самом деле является шаблоном для определенных классов подтипов, а не для истинного родителя, поэтому наличие истинного родителя, не являющегося родителем, может сделать некоторые методы (например, но не ограничиваясь этим) намного проще.

+0

Ударьте меня на это. :) –

+0

@MatthewWatson Да, * может быть * 30 секунд. : p –

+0

Причина, по которой я проверил это как ответ, состоял в том, что он был очень коротким (= читаемым) и решил «Моя проблема». Престижность @MatthewWatson за потраченное время и потраченное время. – LosManos

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

Этот подход работает для любых статических типов или значений, которые вы хотите, чтобы обеспечить, которые не зависят от типа параметра. Он также работает со статическими методами.

(Примечание: Если вы не хотите, чтобы кто-нибудь экземпляр базового класса, сделать его абстрактным.)

Смежные вопросы