Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 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

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

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

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