Есть ли способ использовать интерфейсы для достижения аналогичного результата? - PullRequest
0 голосов
/ 04 мая 2020

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

Каждый из моих типов имеет константу, определенную в них так:

public class Class : IClassInterface
{
    public const string ClassConstant = "Class Constant Value";
}

Во время инициализации моего приложения я получаю доступ к этой константе через отражение как таковое:

foreach (Type type in Assembly.GetExecutingAssembly().DefinedTypes)
    if (typeof(IClassInterface).IsAssignableFrom(type))
    {
        string constantString = type.GetField("ClassConstant")?.GetRawConstantValue()?.ToString();
    }

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

Я первоначально пытался использовать свойство publi c вместо константы, но Я обнаружил, что свойство доступно только после создания экземпляра класса, поэтому мне потребовалось вызвать Activator.CreateInstance для каждого типа, просто чтобы прочитать значение строки, которая не изменится при жизни приложения.

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

1 Ответ

0 голосов
/ 04 мая 2020

Благодаря @Christopher, это решение будет работать для моего случая использования:

public class Class : IClassInterface
{
    public const string ClassConstant = "Class Constant Value";
    public string Constant { get { return ClassConstant; } }
}

public interface IClassInterface
{
    public string Constant { get; }
}
...