Статический контекст всегда один на С#?
У меня есть библиотека, в которой есть статическое поле. Я хочу создать приложение и ссылаться на эту библиотеку, чтобы у меня было два экземпляра этого статического поля..Net runtime не позволяет ссылаться на одну и ту же библиотеку дважды, но мне интересно, можно ли преодолеть это ограничение?
Мне не разрешено изменять библиотеку, но я могу ее скопировать/переименовать.
Ответы
Ответ 1
Это не так безумно, как вы думаете. Фактически, вы можете достичь этого, используя AppDomains.
Каждый AppDomain
имеет собственное хранилище для статических переменных. Таким образом, вы можете просто создать второй AppDomain в своем процессе и обмениваться данными между ними, используя объект, который наследует от MarshalByRefObject
, как в этом примере MSDN.
Ответ 2
В то время как предложение Лукаса в AppDomains будет работать, альтернативно вы можете создать этот эффект с помощью дженериков, поскольку класс с разными аргументами общего типа рассматривается как другой класс, и поэтому имеет свои собственные статические поля.
public class SomeClass<T>
{
public static string SomeField;
}
Тогда:
SomeClass<int>.SomeField = "A";
SomeClass<string>.SomeField = "B";
Console.WriteLine(SomeClass<int>.SomeField); // A
Console.WriteLine(SomeClass<string>.SomeField); // B
Например, SomeClass<int>
будет установлен в библиотеке, тогда как SomeClass<string>
будет вашей копией. Конечно, это будет работать, только если вы можете изменить библиотеку или библиотеку, которая уже использовала генерические файлы.
Ответ 3
Оба предложения должны работать, но все они потрясающе относятся к архитектуре.
Я не знаю о контексте, но в вашем случае можно просто создать класс агрегации с новым свойством, которое не является статичным и имеет только два экземпляра.
Это звучит как лучший способ для меня.
Каждый раз, когда у меня есть смарт-код, в голове появляется предупреждение. Смарт-код всегда слишком умен для разработчика.