Как получить доступ к «статически» членам экземпляров типов? - PullRequest
0 голосов
/ 20 февраля 2019

Я хотел бы получить доступ "статически" (т.е. во время компиляции) к заданным экземплярам-членам типов (конечно, чтобы получить их статические свойства, а не действительные значения или что-то в этом роде).

Рассмотрим:

interface IFoo
{
  int X { get; }
}

Я хотел бы получить доступ к X напрямую, чтобы получить то, что известно во время компиляции, например:

Console.WriteLine(typeof(IFoo::X).Name);

Отражение - это среда выполнения, я спрашиваю о компиляции-время.

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Нет, оператор C # не может ссылаться на элементы безопасным для типов способом, подобным этому.Это функция, которая часто запрашивается, но действительно трудно хорошо спроектировать .Оператор nameof, представленный в C # 6, позволяет обойти большинство проблем проектирования, удовлетворяя при этом большинство вариантов использования.

Даже если предполагаемый оператор infoof сделал существует, маловероятно, что существует способ доступа к определенным свойствам из него (например, к имени возвращаемого типа свойства) во время компиляции.

Если важна часть "времени компиляции"вам ради безопасности , а не для того, чтобы реально оценить имя во время компиляции, есть способы, которые могут сработать.Например:

public static class TypeHelpers<TInput>
{
    public static Type GetReturnType<TOutput>(Func<TInput, TOutput> func) =>
        typeof(TOutput);
}

Тогда:

Type returnType = TypeHelpers<IFoo>.GetReturnType(foo => foo.X);
Console.WriteLine(returnType.FullName); // System.Int32

Это было бы лучше, чем найти член во время выполнения, но он все еще запрашивает имя типаво время исполнения.

0 голосов
/ 20 февраля 2019

Краткий ответ: вы не можете сделать это в время компиляции .Вы можете сделать это в время выполнения , используя отражение, хотя.

Однако есть некоторая помощь, чтобы получить хотя бы имя, используя nameof:

nameof(IFoo.Name)

Этооднако, я не дам вам тип времени компиляции этого члена.

Следующая функция никогда не доходила до языковой функции, хотя для нее существует некоторый запрос:

typeof(IFoo.Name)

или даже infoof -оператор, упомянутый Эриком Липертом (см. ответ Джона).

...