c# примеры - .NET Reflection установить частную собственность




get property (5)

Вам необходимо установить поле, потому что у вас нет установленного свойства для установки свойства. Дополнительно необходим BindingFlags.NonPublic для непубличных объектов.

dto.GetType().
    GetField("modifiedOn", 
    BindingFlags.NonPublic|BindingFlags.SetField|BindingFlags.Instance).
    SetValue(dto, valueToSet);

Если у вас есть свойство, определенное следующим образом:

private DateTime modifiedOn;
public DateTime ModifiedOn
{
    get { return modifiedOn; }
}

Как вы установите его на определенное значение с отражением?

Я пробовал оба:

dto.GetType().GetProperty("ModifiedOn").SetValue(dto, modifiedOn, null);

а также

dto.GetType().GetProperty("modifiedOn").SetValue(dto, modifiedOn, null);

но безуспешно Извините, если это глупый вопрос, но я впервые использую Reflection с C # .NET.


Если у вас есть личное свойство с установщиком, вы можете использовать этот метод Extension для установки значения:

using System.Reflection;

public static class ObjectExtensions
{
    public static void SetPrivateValue<T>(this T obj, string propertyName, object value)
    {
        var type = typeof(T);
        type.GetTypeInfo().GetDeclaredProperty(propertyName).SetValue(obj, value, null);
    }
}

У этого нет сеттера; вам нужно:

public DateTime ModifiedOn
{
    get { return modifiedOn; }
    private set {modifiedOn = value;}
}

(возможно, вам придется использовать BindingFlags - я попробую через минуту)

Без установщика вам придется полагаться на шаблоны / имена полей (что является хрупким) или анализировать IL (очень сложно).

Следующее работает отлично:

using System;
class Test {
    private DateTime modifiedOn;
    public DateTime ModifiedOn {     
        get { return modifiedOn; }
        private set { modifiedOn = value; }
    }
}
static class Program {
    static void Main() {
        Test p = new Test();
        typeof(Test).GetProperty("ModifiedOn").SetValue(
            p, DateTime.Today, null);
        Console.WriteLine(p.ModifiedOn);
    }
}

Он также работает с автоматически реализованным свойством:

public DateTime ModifiedOn { get; private set; }

(где опора на имя поля ужасно сломается)


Вы можете попытаться установить поле поддержки, а не свойство; Вы должны использовать GetField() не GetProperty() .


например:

<applicationSettings>
        <MyApp.My.MySettings>
            <setting name="Printer" serializeAs="String">
                <value>1234 </value>
            </setting>
        </MyApp.My.MySettings>
    </applicationSettings>
Dim strPrinterName as string= My.settings.Printer






c# .net reflection