클래스 인스턴스에서 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를 얻으려면 뜨거운 모르겠다.
어떠한 제안?
이 구현을 썼습니다.지난 화요일에 우리 사용자 그룹을위한 람다에 대한 프리젠 테이션을 위해서.
넌 할 수있어
< 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;
}
}
나는 완벽한 해결책을 찾았다.이 포스트
public static string GetPropertyName<T>(Expression<Func<T>> propertyExpression)
{
return (propertyExpression.Body as MemberExpression).Member.Name;
}
그리고 사용법 :
var propertyName = GetPropertyName(
() => myObject.AProperty); // returns "AProperty"
매력처럼 작동합니다.
다음과 같이 할 수 있습니다.
Type t = someInstance.getType();
foreach (MemberInfo mi in t.GetMembers())
{
if (mi.MemberType == MemberTypes.Property)
{
Console.WriteLine(mi.Name);
}
}
에 대한 모든 속성 이름 가져 오기instance
타입.
PropertyInfo.Name을 사용하여 속성의 이름 (ID로 가정 한 이름)을 가져올 수 있습니다. typeof (className) .GetProperties ()에서 반환 된 PropertyInfo []를 반복하면됩니다.
foreach (PropertyInfo info in typeof(MyClass).GetProperties())
{
string name = info.Name;
// use name here
}
원하는 속성을 명시 적으로 처리 했으므로 이름을 알 수 있습니다. 입력 할 수 있습니까?
이것이 당신이 찾고있는 것을 얻을 수 있다면 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);
첫 번째 샘플에서 클래스의 메소드 업데이트라고 가정 해 보겠습니다.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}
클래스 인스턴스의 속성 값입니다.
그래서, 문제는 속성 이름을 얻는 방법입니다 (반사)을 속성 이름을 문자열로 사용하지 않고 속성에서 제거합니다 (필드 이름 오타를 방지하기 위해).
MembersOf<T>.GetName<R>(Expression<Func<T,R>> expr)
와MembersOf.GetName<T>(Expression<Func<T,Object>> expr)
더 쉽고 특정 R 유형이 필요하지 않습니다 (컴파일시에도 추측됩니다). - Yves M.