C# устанавливают свойства по имени в последовательности Cписка полей

Я получаю весь случай объекта с этим кодом:

 Type type = this.GetType();
 FieldInfo[] fields = type.GetFields(BindingFlags.NonPublic |
                                     BindingFlags.Instance);  

но я не могу измениться, собственность, такая как Позволила для кнопок потому что , SetValue получают цель Класса случая и у меня нет этого. у меня есть просто имя и тип класса. теперь, как измениться, собственность (Позволила) объектов, которые существуют в областях.

1
nl ja de
Нет никакого значения к изменению , Позволенный собственность чего-то это doesn' t существуют. Можете вы уточнять какой you' ре, пытающееся сделать и почему?
добавлено автор Bobson, источник
Ваш случай это . Вы получаете свой Тип от случая класса.
добавлено автор Paul Sasik, источник
Повторить @PaulSasik Если тип you' ре, смотрящее на, является типом это случай, ваш случай был бы это
добавлено автор Peter Ritchie, источник

2 ответы

попытайтесь изменить свой код отражения немного. С одной стороны, необходимо сослаться и на объект, и собственность , что вы определенно хотите. Помните, , Собственность не является тем же самым как Область .

MyObject.GetType().GetProperty("Enabled").SetValue(MyObject, bEnabled, null);

вы используете тип любого , MyObject , быть, что кнопка или форма или независимо от того, что... тогда вы ссылаетесь на собственность по имени , Позволили , тогда вы задерживаете его против MyObject .

если вы хотите принести свойства перед рукой, можно сохранить случаи в переменной, но снова помнить, что свойства не области.

PropertyInfo[] piSet = MyObject.GetType().GetProperties();

можно использовать это , чтобы получить набор свойств, но не рекомендовал, если , это не имеет того же самого Тип как контроль, который вы пытаетесь позволить/отключить.

Добавленный Редактируют

После перечитывания вопроса я вытащил это из него: То, что вы, кажется, хотите, является многослойным отражением и непатентованными средствами. Контролем, который вы ищете, является Область, приложенная к "этому". То, что можно сделать, является чем-то вдоль этих линий.

Type theType = this.GetType();
FieldInfo[] fi = theType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance);
foreach ( FieldInfo f in fi)
{
    //Do your own object identity check
    //if (f is what im looking for)
    {
        Control c = f.GetValue(this) as Control;
        c.Enabled = bEnabled;
    }
    //Note: both sets of code do the same thing
    //OR you could use pure reflection
    {
        f.GetValue(this).GetType().GetProperty("Enabled").SetValue(f.GetValue(this), bEnabled, null);
    }
}
1
добавлено

В первую очередь, вы на самом деле используете области объекта. Если вы действительно хотите перезаписываемые свойства, то вы хотите что-то вроде этого:

PropertyInfo[] properties = type.GetProperties(Public | SetProperty | Instance);

Как только у вас есть это, ваша позволенная недвижимость могла бы быть установлена таким образом:

myenabledPropertyInfo.SetValue(targetObject, value, null);

где targetobject - объект, чей Позволенный собственность мы интересуемся, и стоимость - стоимость, которую мы хотим назначить (в этом случае, по-видимому булево...)

Надежда, которая помогает...

0
добавлено
Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot