Статический контекст всегда один в C#?
У меня есть библиотека, которая имеет статическое поле внутри. Я хочу создать приложение и ссылаться на эту библиотеку, чтобы у меня было два экземпляра этого статического поля. .Net runtime не позволяет ссылаться на одну и ту же библиотеку дважды, но мне интересно, можно ли преодолеть это ограничение?
Мне не разрешено изменять библиотеку, но я могу скопировать/переименовать ее.
3 ответа:
это не так безумно, как вы думаете. На самом деле, вы можете достичь этого с помощью AppDomains.
каждого
AppDomain
имеет свое собственное место хранения для статических переменных. Поэтому вы можете просто создать второй домен в процессе, и связи между ними, используя объект, который наследует отMarshalByRefObject
как и в это пример MSDN.
пока Лукаса предложение на 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>
будет ваша копия. Конечно, это будет работать только в том случае, если вы можете изменить библиотеку или библиотеку уже использовал дженерики.
оба предложения должны работать, но все они потрясающе относятся к архитектуре.
Я не знаю о контексте, но в вашем случае можно просто создать класс агрегации с новым свойством, которое не является статическим и имеет только два экземпляра. Это звучит как лучший способ для меня.
каждый раз, когда у меня есть смарт-код, предупреждение начинается в моей голове. Умный код всегда слишком умен для разработчика.