Is static context always single in C#?

C#.Net

C# Problem Overview


I have a library that has a static field inside. I want to create an app and reference this library so I'd have two instances of this static field. .Net runtime does not allow to reference the same library twice, but I wonder is it possible to overcome this limitation?

I'm not allowed to change the library, but I can copy/rename it.

C# Solutions


Solution 1 - C#

That's not as crazy as you think. In fact, you can achieve this using AppDomains.

Each AppDomain has its own storage location for static variables. So you can just create a second AppDomain in your process, and communicate between them using an object that inherits from MarshalByRefObject like in this MSDN example.

Solution 2 - C#

While Lucas' suggestion on AppDomains would work, alternatively you could create this effect using generics, as a class with different generic type arguments is treated as a different class, and therefore has its own static fields.

public class SomeClass<T>
{
	public static string SomeField;
}

Then:

SomeClass<int>.SomeField = "A";
SomeClass<string>.SomeField = "B";

Console.WriteLine(SomeClass<int>.SomeField);	// A
Console.WriteLine(SomeClass<string>.SomeField);	// B

For example, the SomeClass<int> would be set in the library, whereas the SomeClass<string> would be your copy. Of course this would only work if you could change the library, or the library already used generics.

Solution 3 - C#

Both suggestions should work, but they are all terrific concerning architecture.

I a not aware about the context, but in your case is it possible to just create an aggregation class with a new property that is not static and just have two instances. This sound like a better way for me.

Everytime I have smart code, an alert starts in my head. Smart code is always too clever for a developer.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionArchegView Question on Stackoverflow
Solution 1 - C#Lucas TrzesniewskiView Answer on Stackoverflow
Solution 2 - C#Daniel A.A. PelsmaekerView Answer on Stackoverflow
Solution 3 - C#Frédéric De Lène MirouzeView Answer on Stackoverflow