Я знаю, что общий тип не будет использоваться среди экземпляров разных типов, построенных по принципу закрытия. Это означает, что для общего класса C<T>
, который имеет статическое поле X
, значения C<int>.X
и C<string>.X
имеют совершенно разные независимые значения.
В моем случае мне действительно нужно иметь статическое поле, разделяемое между экземплярами с разными родовыми аргументами. Единственное решение, которое я нашел, это «», который определяет базовый класс для хранения ваших статических элементов, а затем задайте свой общий тип для наследования этого типа. «
Проблема в том, что мой класс уже наследуется от других .net класс.
Есть ли другой способ решить эту проблему?Совместное использование статических полей среди разных экземпляров универсального класса
ответ
Вы можете обрабатывать запросы прочь к внутреннему необщему классу для хранения общих данных:
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"
Почему нужно быть внутренним? –
Этого не должно быть, но он скрывает детали реализации. Нет причин, по которым вы не могли бы просто использовать непокрытый класс. –
Наследуйте от базового класса, не являющегося общим, который наследуется от другого .NET-класса, из которого наследуется ваш общий класс. Сохраните общее статическое состояние там. Конечно, это не сработает, если другой класс .NET сам по себе является общим; к счастью, вы указали, что это не так.
, которые решают мою проблему, спасибо. но не будет другого более чистого решения? –
Какова цель для статического поля ?. Возможно, с некоторым пониманием цели можно было бы предложить альтернативные решения. –
Вы считали, что просто создаете отдельный класс для хранения статического поля? Он не должен иметь никакого отношения наследования к вашему родовому типу. –
Если ваш класс является общим; он, вероятно, не должен делиться «статическим» состоянием. Кроме того, использование 'static' для этого является * огромным * запахом кода, и это, вероятно, должно быть сделано по-другому. – BradleyDotNET