2013-07-12 3 views
0

이것은 내가 데이터베이스에서 값을 업데이트하는 방법에 대한 간단한 예는 다음과 같습니다이름으로 속성에 액세스하는 방법은 무엇입니까?

var context = new dbEntities(); 
var car = context.CarTable.Where(p => p.id == id).FirstOrDefault(); 
car.Make = "Volvo"; 
context.SaveChanges(); 

그러나, 지금해야 할 일을 대신 이름으로 재산을 얻는 것입니다. 이것이 이론에서 내가하고자하는 것입니다 :

var context = new dbEntities(); 
var car = context.CarTable.Where(p => p.id == id).FirstOrDefault(); 
**car["Make"] = "Volvo";** 
context.SaveChanges(); 

이것은 EF에서 가능합니까?

+8

리플렉션을 통해이 작업을 수행 할 수 있지만 매우 느린 (http://stackoverflow.com/questions/1196991/get-property-value-from-string-using-reflection-in -c-sharp 및 http://stackoverflow.com/questions/619767/net-reflection-set-object-property) – derape

+5

그리고 왜 그렇게하고 싶습니까? – Satpal

+0

이름으로 등록 정보가 필요한 이유가 무엇입니까? – Bas

답변

2

천천히 느껴지므로 반성을 사용하지 않을 것입니다.

특히 표현식을 캐시하는 경우 표현식 트리를 사용할 수 있습니다. 그것에 관한 기사는 this link을 확인하십시오. 필자는 객체와 propertyname (문자열)을 취하고 아티클의 코드를 사용하여 func를 작성 (또는 캐시에서 가져옴)하고 함수를 실행하는 기사의 코드 주위에 래퍼를 작성합니다.

+0

이것이 리플렉션과 어떻게 다른지 이해하지 못합니다. 확실히 'PropertyInfo' 인스턴스가 캐시 된 상태입니다. –

+0

실제로 표현 트리 생성에는 반사가 포함됩니다 (속성 정보를 검색해야 함). 그러나 일단 더 이상 리플렉션이 필요하지 않은 컴파일 된 표현식 트리가 있으면 컴파일 된 표현식 트리를 실행하면됩니다. 그래서 당신에게 더 나은 퍼포먼스를 제공하는 것은 리플렉션을 사용하여 속성 값을 검색/설정하기 위해 리플렉션을 연속적으로 사용하는 것과 달리 표현 트리를 컴파일하는 리플렉션을 사용하는 것입니다. 표현식 트리가 컴파일되면 코드에서 속성 값을 직접 가져오고 설정하는 것보다 훨씬 빠릅니다. – Maarten

+0

'PropertyInfo' 인스턴스가 아니라 컴파일 된 표현 트리 (결과'Func '과''값)를 캐쉬해야합니다. – Maarten

0

주된 질문은 정말로 이것을 왜 필요로합니까?

가장 좋은 방법은 여전히 ​​car.Make = "Volvo";입니다.

  • 느린 :

    var property = typeof (Car).GetProperty("Make"); 
    property.SetValue(car, "BMW", null); 
    

    여기 두 단점이 있습니다 : 문자열 이름이 강력하게 필요한 경우

    , 당신은 반사를 사용할 수 있습니다.

  • 컴파일러에서 문자열을 검사 할 수 없습니다.

다른 방법 - 당신은 인덱서를 사용하여 전환 할 수 있습니다

public class Car 
    { 
     public string Make { get; set; } 

     public string this[String name] 
     { 
      set 
      { 
       switch (name) 
       { 
        case "Make": 
         Make = value; 
         break; 
        ... 
       } 
      } 
     } 
    } 

그리고 단지 car["Make"] = "Volvo"; 그것은 빠르다,하지만 일반-문제가 발생합니다 : 당신은 문자열을 구문 분석 또는 객체와 함께 작동해야합니다.

+0

스위치 대신 Reflection을 사용하여 속성을 가져옵니다. –

+0

Reflection을 피하는 방법에 관한 것입니다. – arctangent

0
public class Car 
{ 
    public string Make { get; set; } 

    public object this[string name] 
    { 
     get 
     { 
      var property = this.GetType().GetProperties().FirstOrDefault(p => p.Name.Equals(name)); 

      if (property != null) 
      { 
       return property.GetValue(this, null); 
      } 

      return null; 
     } 
     set 
     { 
      var property = this.GetType().GetProperties().FirstOrDefault(p => p.Name.Equals(name)); 

      if (property != null) 
      { 
       property.SetValue(this, value, null); 
      } 
     } 
    } 
} 
관련 문제