Как собрать все «экземпляры» статического класса с родовым типом в C #? - PullRequest
1 голос
/ 23 октября 2019

Я тестирую модуль моего приложения на c # синхронно. Внутри моего приложения у меня есть некоторые статические классы, и я хочу сбросить их между тестовыми примерами, без написания / использования новой тестовой среды или подобного.

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

Как видно из заголовка, у меня есть статический класс с универсальным типом, поэтому во время выполнения у меня есть несколько «экземпляров» этого статического класса для каждого другого типа.

есть ли возможность собрать всю статику во время выполнения в целом?

если нет, есть ли какой-нибудь способ получить все типы "версии / экземпляры" универсального статического класса, поэтому я недолжны ли жестко закодировать каждый возможный используемый тип?

    public static class DialogControlService<DialogType>
    {
        public static DialogResult DesiredDialogResult { get; set; }
        public static dynamic Attribute { get; set; }
    }       

Ответы [ 2 ]

2 голосов
/ 23 октября 2019

Единственный способ сделать это состоит в том, чтобы иметь инициализатор типа (static DialogControlService() {...}), который регистрирует тип (используя аргумент универсального типа) где-нибудь потокобезопасным способом.

0 голосов
/ 23 октября 2019

Для любого, кто найдет это, здесь мои классы, которые используются для программного заполнения форм:

 public static class DialogControlService<DialogType>
{
    public static DialogResult DesiredDialogResult { get; set; }
    public static dynamic Attribute { get; set; }

    static DialogControlService()
    {
        DialogControlRegistrationService.Register(typeof(DialogType));
    }
}

public static class DialogControlRegistrationService
{
    public static List<Type> RegisteredTypes { get; private set; }
    public static void Register(dynamic type)
    {
        RegisteredTypes.Add(type);
    }

    static DialogControlRegistrationService()
    {
        RegisteredTypes = new List<Type>();
    }
}

, а вот код для сброса всей статики с универсальным типом:

 foreach (Type T in DialogControlRegistrationService.RegisteredTypes)
            {
                Type genericType = typeof(DialogControlService<>).MakeGenericType(new Type[] { T });
                var property = genericType.GetProperty("DesiredDialogResult",
                    BindingFlags.Static | BindingFlags.Public);
                property.SetValue(genericType, DialogResult.None);
                property = genericType.GetProperty("Attribute",
                    BindingFlags.Static | BindingFlags.Public);
                property.SetValue(genericType, null);
            }
            DialogControlRegistrationService.RegisteredTypes.Clear();
...