Доступ к имени свойства C # или атрибутам - PullRequest
14 голосов
/ 11 сентября 2009

Я хотел бы автоматически генерировать операторы SQL из экземпляра класса. Метод должен выглядеть как Update (свойства объекта [], объект PrimaryKeyProperty). Метод является частью экземпляра (класс, базовый метод - универсальный для любого дочернего элемента). Массив свойств - это массив свойств класса, который будет использоваться в операторе update . Имена свойств равны именам полей таблицы.

Проблема в том, что я не могу получить имена свойств.

Есть ли возможность получить имя свойства внутри экземпляра класса? образец:

public class MyClass {
public int iMyProperty { get; set; }
public string cMyProperty2 { get; set; }
{

main() {
 MyClass _main = new MyClass();

_main.iMyProperty.*PropertyName* // should return string "iMyProperty"

{

Я знаю о PropertyInfo, но не знаю, как получить идентификатор свойства из массива GetProperties ().

Есть предложения?

Ответы [ 7 ]

28 голосов
/ 11 сентября 2009

Только что написал реализацию этого для презентации о лямбдах для нашей группы пользователей в прошлый вторник.

  • Вы можете сделать

    MembersOf .GetName (x => x.Status)

  • Или

    var a = new Animal () a.MemberName (x => x.Status)

код:

public static class MembersOf<T> {
    public static string GetName<R>(Expression<Func<T,R>> expr) {
        var node = expr.Body as MemberExpression;
        if (object.ReferenceEquals(null, node)) 
            throw new InvalidOperationException("Expression must be of member access");
        return node.Member.Name;
    }
}
10 голосов
/ 20 января 2011

Я нашел идеальное решение в Это сообщение

public static string GetPropertyName<T>(Expression<Func<T>> propertyExpression)
{
   return (propertyExpression.Body as MemberExpression).Member.Name;
}

А потом для использования:

var propertyName = GetPropertyName(
() => myObject.AProperty); // returns "AProperty"

Работает как шарм

6 голосов
/ 11 сентября 2009

Вы можете сделать что-то вроде этого:

Type t = someInstance.getType();

foreach (MemberInfo mi in t.GetMembers())
{
    if (mi.MemberType == MemberTypes.Property)
    {
        Console.WriteLine(mi.Name);
    }
}

чтобы получить все имена свойств для типа instance.

2 голосов
/ 11 сентября 2009

Вы можете получить имя (я полагаю, это то, что вы имели в виду под ID) свойства, используя PropertyInfo.Name. Просто переберите PropertyInfo [], возвращаемое из typeof (className). GetProperties ()

foreach (PropertyInfo info in typeof(MyClass).GetProperties())
{
    string name = info.Name;
    // use name here
}
1 голос
/ 07 июля 2011

Не уверен на 100%, если это даст вам то, что вы ищете, это извлечет все свойства с атрибутом [Column] внутри вашего класса: В текстовом данных у меня есть:

 public ReadOnlyCollection<MetaDataMember> ColumnNames<TEntity>( )
    {
        return this.Mapping.MappingSource.GetModel(typeof(DataContext)).GetMetaType(typeof(TEntity)).DataMembers;
    }

Извлечение имен столбцов таблицы, которые являются свойствами внутри класса:

       MyDataContext db = GetDataContext(); 
       var allColumnPropertyNames =   db.ColumnNames<Animal>().Where(n => n.Member.GetCustomAttributes(typeof(System.Data.Linq.Mapping.ColumnAttribute), false).FirstOrDefault() != null).Select(n => n.Name);
1 голос
/ 11 сентября 2009

Допустим, (из первого примера, обновление метода класса MyClass):

public class MyClass {

public int iMyStatusProperty { get; set; }
public int iMyKey { get; set; }

public int UpdateStatusProperty(int iValue){
this.iMyStatusProperty = iValue;
return _Update( new[iMyStatusProperty ], iMyKey); // this should generate SQL: "UPDATE MyClass set iMyStatusProperty = {iMyStatusProperty} where iMyKey = {iMyKey}"
}

{iMyStatusProperty} и {iMyKey} являются значениями свойств экземпляра класса.

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

1 голос
/ 11 сентября 2009

Поскольку у вас уже есть явный дескриптор определенного свойства, которое вы хотите, вы знаете имя - вы можете просто ввести его?

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