2009-08-29 3 views
2

다음 코드에 대한 제네릭 솔루션이 있습니까?C# Entity Framework - 제네릭 솔루션

public static int SaveReorder(IList<int> listItems) 
    { 
     int result = 0; 
     int order = 1; 
     Entity1 db = null; 

     using (ObjectContext context = new ObjectContext()) 
     { 
      foreach (int id in listItems) 
      { 
       db = Get(context, id); 
       db.Order = order; 
       context.SaveChanges(); 
       order += 1; 
      } 
      result = 1; 
     } 
     return result; 
    } 

listItems에는 일련의 ID 키가 있습니다. Entity1은 EDM의 EntityObject 중 하나입니다. Get (...)은 현재 ObjectContext와 ID를 기준으로 EntityObject를 가져 오는 동일한 클래스의 사용자 정의 메서드입니다.

우리는이 구현에 대한 일반적인 솔루션을 원하므로 'Order'속성이 모든 EntityObjects에 대한 공통 속성 인 여러 EntityObject에이를 적용 할 수 있습니다. 이것이 가능한가?

답변

1

두 가지 옵션이 마음에 와서 :

  • 어느 엔터티는 '주문'속성을 가진 인터페이스를 구현하자

    인터페이스 IEntityOrder {INT 주문 {얻을; 세트; }}

    부분 클래스 Entity1 : EntityObject {}

    부분 클래스 Entity1 : IEntityOrder {공공 INT 주문 {얻을; 세트; (이 필드 인 경우에 또는의 fieldInfo)}}

  • 또는 사용 반사는 '주문'속성의 값을 설정합니다 :.

    PropertyInfo 파이 = db.GetType() GetProperty를 ("주문");

    pi.SetValue (db, newValue, null);

1

아니요,하지만 향후 동적 키워드를 사용하는 C# 4.0에서는 그렇게 할 수 있습니다. 현재 각 클래스에 의해 구현하기 위해 속성과의 인터페이스를 가질 수 있습니다 주문 재산권

와 인터페이스를 구현

, 나는 EDM에서이 작업을 수행하는 방법을하지 않도록,하지만 그것은 어려울 수 야해.

우리는 이런 종류의 문제를 많이 겪었습니다. C#이 동적 유형을 사용하는 이유는 인터페이스 나 리플렉션에 의존하기 때문입니다. 아카 쉬 이미 제안했다으로

0

확인. 귀하의 답변에 모두 고맙습니다. 여기 내 해결책이 있습니다.

public static int SaveReorder<T>(IList<int> listItems) where T : EntityObject 
    { 
     int result = 0; 
     int volgorde = 1; 
     T entityObject = null; 

     using (vgplannewEntities objectContext = new vgplannewEntities()) 
     { 
      try 
      { 
       foreach (int id in listItems) 
       { 
        entityObject = objectContext.GetEntityByKey<T>(id, new String[] { }); 
        PropertyInfo pi = entityObject.GetType().GetProperty("Volgorde"); 
        pi.SetValue(entityObject, volgorde, null); 
        objectContext.SaveChanges(); 
        volgorde += 1; 
       } 
       result = 1; 
      } 
      catch 
      { 
       result = 0; 
      } 
     } 
     return result; 
    }