Отражение .NET: как получить свойства, определенные в частичном классе - PullRequest
4 голосов
/ 24 июня 2011

Я использую .NET Entity Framework. Я хочу скопировать свойства из одного EntityObject в другой. Но System.Type.GetProperties (), по-видимому, не возвращает свойства, определенные для частичного класса.

Код:

В XXX.edmx / XXX.Designer.cs, сгенерированном Visual Studio, у меня есть класс MyTable:

public partial class MyTable: EntityObject{..}

Я хочу добавить некоторые свойства в класс MyTable, поэтому я добавляю файл XXX.Manual.cs:

public partial class MyTable: EntityObject{
    public string myProp{get;set;}
}

Но myTableObj.GetType().GetProperties() не содержит myProp !!!

Как я могу получить myProp, используя отражение?

[EDIT] Я хочу прокомментировать ответ Алекса, но не знаю, почему раздел кода не отформатирован.

Да, это очень странно. Я использую этот код для копирования свойств из Entity в другой объект:

public static void CopyTo(this EntityObject Entity, EntityObject another){
    var Type = Entity.GetType();
    foreach (var Property in Type.GetProperties()){
        ...
        Property.SetValue(another, Property.GetValue(Entity, null), null);
    }
}
//in some other place:
myTableObj.CopyTo(anotherTableObj);

Конечно, myTableObj & anotherTableObj имеет тип MyTable.

При отладке в метод CopyTo VS показывает, что Entity и еще один имеют тип MyTable, и я вижу Entity.myProp, another.myProp

Но свойство Property в выражении foreach просто не зацикливается на свойстве myProp!

[ПРАВИТЬ] Извините. Код выше (метод CopyTo) является копией ответа Диамандиева на другой вопрос

Но его код неверен: оператор "break" должен быть заменен на "continue": D

Ответы [ 2 ]

6 голосов
/ 24 июня 2011

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

Вероятно, вы не видите свойство myProp, поскольку myTableObj не относится к типу MyTable.

Попробуйте это:

var property = typeof(MyTable).GetProperty("myProp");

[EDIT]

Только что проверил:

EntityObject x = new MyTable();

var property1 = typeof(MyTable).GetProperty("myProp");
var property2 = x.GetType().GetProperty("myProp");

И property1, и property2 вернули свойство.

[РЕДАКТИРОВАТЬ]

Попробовал ваш код, он работал после небольшой модификации:

public static void CopyTo(EntityObject fromEntity, EntityObject toEntity)
{
    foreach (var property in fromEntity.GetType().GetProperties())
    {
        if (property.GetSetMethod() == null)
            continue;
        var value = property.GetValue(fromEntity, null);
        property.SetValue(toEntity, value, null);
    }
}
2 голосов
/ 21 декабря 2012

Хотя и поздно, моя проблема заключалась в том, что Visual Studio сгенерировал следующий код:

public System.Windows.Forms.ListView myListView;

Однако, прежде чем мой ListView отобразился в методе GetProperties, мне пришлось сделать следующее:

public System.Windows.Forms.ListView myListView { get; set; }

Надеюсь, что это может помочь кому-то еще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...