2014-11-21 2 views
1

Я знаю, что общий тип не будет использоваться среди экземпляров разных типов, построенных по принципу закрытия. Это означает, что для общего класса C<T>, который имеет статическое поле X, значения C<int>.X и C<string>.X имеют совершенно разные независимые значения.
В моем случае мне действительно нужно иметь статическое поле, разделяемое между экземплярами с разными родовыми аргументами. Единственное решение, которое я нашел, это «», который определяет базовый класс для хранения ваших статических элементов, а затем задайте свой общий тип для наследования этого типа. «
Проблема в том, что мой класс уже наследуется от других .net класс.
Есть ли другой способ решить эту проблему?Совместное использование статических полей среди разных экземпляров универсального класса

+2

Какова цель для статического поля ?. Возможно, с некоторым пониманием цели можно было бы предложить альтернативные решения. –

+5

Вы считали, что просто создаете отдельный класс для хранения статического поля? Он не должен иметь никакого отношения наследования к вашему родовому типу. –

+0

Если ваш класс является общим; он, вероятно, не должен делиться «статическим» состоянием. Кроме того, использование 'static' для этого является * огромным * запахом кода, и это, вероятно, должно быть сделано по-другому. – BradleyDotNET

ответ

3

Вы можете обрабатывать запросы прочь к внутреннему необщему классу для хранения общих данных:

public class Bar{} 
public class FooGeneric<T> : Bar 
{ 
    public static string SharedData { 
     get { 
      return Foo.SharedData; 
     } 
     set{ 
      Foo.SharedData = value; 
     } 
    } 
} 

internal class Foo 
{ 
    public static string SharedData = "Fizz"; 
} 

использование:

Console.WriteLine(FooGeneric<string>.SharedData); // "Fizz" 

FooGeneric<string>.SharedData = "Buzz"; 
Console.WriteLine(FooGeneric<string>.SharedData); // "Buzz" 

Console.WriteLine(FooGeneric<int>.SharedData);  // "Buzz" 
+0

Почему нужно быть внутренним? –

+0

Этого не должно быть, но он скрывает детали реализации. Нет причин, по которым вы не могли бы просто использовать непокрытый класс. –

1

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

+0

, которые решают мою проблему, спасибо. но не будет другого более чистого решения? –