Доступ к имени или атрибутам С#

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

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

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

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, но я не знаю, как hot получить идентификатор свойства из массива GetProperties().

Любое предложение?

Ответ 1

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

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

    MembersOf <Animal> .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;
    }
}

Ответ 2

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

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

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

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

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

Ответ 3

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

Type t = someInstance.getType();

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

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

Ответ 4

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

foreach (PropertyInfo info in typeof(MyClass).GetProperties())
{
    string name = info.Name;
    // use name here
}

Ответ 5

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

Ответ 6

Скажем (из первого примера, обновление метода класса 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} - значения свойств экземпляра класса.

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

Ответ 7

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

 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);