Статический контекст всегда один в C#?


У меня есть библиотека, которая имеет статическое поле внутри. Я хочу создать приложение и ссылаться на эту библиотеку, чтобы у меня было два экземпляра этого статического поля. .Net runtime не позволяет ссылаться на одну и ту же библиотеку дважды, но мне интересно, можно ли преодолеть это ограничение?

Мне не разрешено изменять библиотеку, но я могу скопировать/переименовать ее.

3 54

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> будет ваша копия. Конечно, это будет работать только в том случае, если вы можете изменить библиотеку или библиотеку уже использовал дженерики.

оба предложения должны работать, но все они потрясающе относятся к архитектуре.

Я не знаю о контексте, но в вашем случае можно просто создать класс агрегации с новым свойством, которое не является статическим и имеет только два экземпляра. Это звучит как лучший способ для меня.

каждый раз, когда у меня есть смарт-код, предупреждение начинается в моей голове. Умный код всегда слишком умен для разработчика.