Есть 3 способа, которые, я думаю, будут работать для вас:
- Создать неуниверсальный базовый класс, содержащий общие поля
- Создать неуниверсальный отдельный класс, содержащий общие поля
- Создайте неуниверсальный тип, который содержит эти общие значения, и повторно используйте его внутри ваших общих
Для третьего, так как вы говорите, что вы на самом деле не хотите вариант 1 или 2, вот пример:
public abstract class Shared
{
private readonly static Dictionary<Guid, object> _Variables
= new Dictionary<Guid, object>();
protected void SetValue<T>(Guid key, T value)
{
lock (_Variables)
_Variables[key] = value;
}
protected T GetValue<T>(Guid key)
{
object temp;
lock (_Variables)
if (!_Variables.TryGetValue(key, out temp))
return default;
return (T)temp;
}
}
public class Shared<T> : Shared
{
private readonly Guid _Key;
public Shared(Guid key)
{
_Key = key;
}
public T Value
{
get => GetValue<T>(_Key);
set => SetValue<T>(_Key, value);
}
}
Вы могли бы использовать это так:
public class MyClass<T>
{
private static readonly Shared<string> _Shared
= new Shared<string>(Guid.Parse("521ecaba-2a5e-43f2-90e0-fda38a32618c"));
public void Set(string value)
{
_Shared.Value = value;
}
public void Get()
{
Console.WriteLine(_Shared.Value);
}
}
НаборМетоды / Get этого MyClass использовались для проверки того, что значение, установленное через один закрытый тип, доступно через другой, например:
var mc1 = new MyClass<int>();
var mc2 = new MyClass<string>();
mc1.Set("Test");
mc2.Get();
Это выдаст Test
.
Даже есливсе закрытые типы MyClass<T>
будут иметь свой собственный статический экземпляр Shared<T>
, значение , содержащееся в этом экземпляре, будет поддерживаться общим словарем, который совместно используется всеми типами, использующими этот тип Shared<T>
.
Лично я бы порекомендовал пойти сстатический неуниверсальный базовый класс, хотя:
public abstract class MyClass
{
protected static string _Shared;
}
public class MyClass<T> : MyClass
{
public void Set(string value)
{
_Shared = value;
}
public void Get()
{
Console.WriteLine(_Shared);
}
}
Если вы предпочитаете, чтобы базовый класс, то есть тип, содержащий общее значение, был недоступен, и не так уж много с базовыми классами (что неи со структурами), вы можете легко сделать его совершенно отдельным классом:
internal static class MyClassShared
{
public static string Shared;
}
public class MyClass<T>
{
public void Set(string value)
{
MyClassShared.Shared = value;
}
public void Get()
{
Console.WriteLine(MyClassShared.Shared);
}
}