Как получить все свойства указанного типа в классе без отражения - PullRequest
2 голосов
/ 29 декабря 2011

У меня есть класс, который имеет массу свойств. Большинство из них имеют пользовательские типы. Я хочу получить все эти свойства, тип интерфейса которых одинаков.

Public class abc:IamLegend
{
    few properties
}

public class def:IamLegend
{
    few properties
}

public class on_which_iamworking
{
    public abc propabc{ get; set; }
    public def propdef{ get; set; }
    public someothertype propother{ get; set; }
}

Я хочу что-то, что возвращает propabc и propdef.

Я знаю, как сделать это с помощью отражения, но я ищу другой путь.

Я работаю над c # 4.0

Спасибо

Ответы [ 4 ]

7 голосов
/ 29 декабря 2011

Боюсь, что это невозможно во время выполнения без использования отражения.Вот для чего предназначено отражение.

1 голос
/ 29 декабря 2011

Основная проблема рефлексии в том, что она медленная.Если вы не хотите использовать отражение только из-за его медлительности, вы можете кэшировать свой список свойств в каком-то статическом свойстве или классе.Я широко использовал эту технику в подобных задачах, и с производительностью проблем не было.

Если у вас священная война против отражения, вы можете создать специальную утилиту, которая анализирует файл C # (или строит ваши проекты, загружает выводсборка и использование отражения, но только перед сборкой, а не во время выполнения), находит необходимые свойства и записывает их в автоматически сгенерированный файл (возможно, также файл кода C #) в качестве инициализатора свойств массива статического класса.И вызовите этот утилитал на этапе предварительной сборки вашего проекта.Тогда вы получите все необходимые свойства полностью без отражений =) (но я бы этого не сделал)

0 голосов
/ 24 апреля 2012

Существует альтернативный подход для компонентов.Это TypeDescriptor для классов, которые реализуют IComponent.Я считаю, что используется WPF.

0 голосов
/ 29 декабря 2011

Ну, есть два способа:

1 /

 return new List<string> { "propabc", "propdev" };

2 / Отражение: P

Если вам нужно получить список свойств много раз иопасаясь влияния на производительность, вычисляйте список только один раз и сохраняйте его в статическом свойстве (поскольку список свойств класса не изменится во время выполнения).

...