14

클래스 인스턴스에서 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 알고 있지만 GetProperties () 배열에서 속성 ID를 얻으려면 뜨거운 모르겠다.

어떠한 제안?

7 답변


28

이 구현을 썼습니다.지난 화요일에 우리 사용자 그룹을위한 람다에 대한 프리젠 테이션을 위해서.

  • 넌 할 수있어

    < Animal > MembersName > .GetName (x => x.Status)

  • 또는

    var a = 새 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;
    }
}


  • 안녕하세요 George, 귀하의 솔루션은 MembersOf < Animal > .GetName (x = > x.Gender.Text)와 같은 중첩 된 Lambda에 대해서는 " Text "가 아닌 " Gender.Text "를 제공해야합니다. - Stef Heyenrath
  • @ 스테프, 맞습니다. x.Gender.Text는 멤버 접근 자입니다. 그러나 구현을 확인하십시오. 전체 구문 트리를 감지하고 반복적으로 반복하도록 만드는 것이 상대적으로 쉽습니다. - George Mauer
  • LukeH의 답변stackoverflow.com/questions/3049825/…내가 필요한 것입니다. - Stef Heyenrath
  • @GeorgeMauer 대체하지 마세요.MembersOf<T>.GetName<R>(Expression<Func<T,R>> expr)MembersOf.GetName<T>(Expression<Func<T,Object>> expr)더 쉽고 특정 R 유형이 필요하지 않습니다 (컴파일시에도 추측됩니다). - Yves M.
  • @ 예브. 그게 무슨 이점이 있겠 어? - George Mauer

10

나는 완벽한 해결책을 찾았다.이 포스트

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

그리고 사용법 :

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

매력처럼 작동합니다.


7

다음과 같이 할 수 있습니다.

Type t = someInstance.getType();

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

에 대한 모든 속성 이름 가져 오기instance타입.


  • 그는 모든 속성 이름, 특정 속성 이름을 원하지 않습니다. - George Mauer
  • 확실하지 downvote 장점. 문제는 " 클래스 인스턴스 내에 속성 이름을 가져 오는 옵션이 있습니까? " 인쇄 작업을하는 루프가 나타났습니다.모든클래스 인스턴스의 속성 이름은 모두 업데이트 할 수 있지만 Update 프로 시저로 전달하는 배열로 가져올 수 있습니다. 문제가 무엇인지 알 수 없습니다. - Vinay Sajip

2

PropertyInfo.Name을 사용하여 속성의 이름 (ID로 가정 한 이름)을 가져올 수 있습니다. typeof (className) .GetProperties ()에서 반환 된 PropertyInfo []를 반복하면됩니다.

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


  • 나는 당신에게 +10을 줄 수 있었으면 좋겠다 :) - Eric Herlitz

1

원하는 속성을 명시 적으로 처리 했으므로 이름을 알 수 있습니다. 입력 할 수 있습니까?


  • 나는 코드가 파생 클래스에서도 작동하기를 원한다고 생각한다. 그래서 그는 리플렉션을 사용해야한다. - Zach Johnson
  • 주요 아이디어는 이름을 복제하는 것이 아닙니다. 따라서 클래스 (속성 포함)가 작성되면 자동 테이블 생성, CRUD 문 및인텔리 센스. - FrenkR

1

이것이 당신이 찾고있는 것을 얻을 수 있다면 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);


1

첫 번째 샘플에서 클래스의 메소드 업데이트라고 가정 해 보겠습니다.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}클래스 인스턴스의 속성 값입니다.

그래서, 문제는 속성 이름을 얻는 방법입니다 (반사)을 속성 이름을 문자열로 사용하지 않고 속성에서 제거합니다 (필드 이름 오타를 방지하기 위해).

연결된 질문


관련된 질문

최근 질문