2010-08-02 8 views
1

코드 중복을 제거하기 위해 예제 양식 http://blogs.msdn.com/b/davidebb/archive/2009/10/23/using-c-dynamic-to-call-static-members.aspx을 사용하려고했습니다.코드를 중복 제거하는 방법

if (Categories != null) { 
     foreach (var item in Categories) 
     { 
      if (item.ID != 0) 
      { 
       Category category = Category.Load(item.ID); 
       category.Name = item.Name; 
       category.Project = project; 
       category.Save(); 
      } 
      else 
      { 
       if(!String.IsNullOrEmpty(item.Name)) 
       { 
        Category category = new Category(project, item.Name); 
        category.Save(); 
       } 
      } 
     } 
} 


      if (Priorities != null) 
      { 
       foreach (var item in Priorities) 
       { 
        if (item.ID != 0) 
        { 
         Priority priority = Priority.Load(item.ID); 
         priority.Name = item.Name; 
         priority.Project = project; 
         priority.Save(); 
        } 
        else 
        { 
         if (!String.IsNullOrEmpty(item.Name)) 
         { 
          Priority priority = new Priority(project, item.Name); 
          priority.Save(); 
         } 
        } 
       } 

나는 다음과 같이 뭔가를하려고 노력하지만 오류 메시지

부분에서 비 대리자 형식 를 호출 할 수 없습니다

if (!String.IsNullOrEmpty(item.Name)) 
       { 
        dynamic newObject = typeDynamic(project, item.Name); 
        newObject.Save(); 
       } 

을 데
SaveObjects(typeof(Category), Categories.ToList(), project); 
SaveObjects(typeof(Priority), Priorities.ToList(), project); 

도움주세요.

감사합니다.

무엇이 잘못되었으며 어떻게 해결할 수 있습니까?

private void SaveObjects(Type type, dynamic currentItems, Project project) 
    { 
     dynamic typeDynamic = new StaticMembersDynamicWrapper(type); 
     foreach (var item in currentItems) 
     { 
      if (item.ID != 0) 
      { 
       dynamic classValues = typeDynamic.Load(item.ID); 
       classValues.Name = item.Name; 
       classValues.Project = project; 
       classValues.Save(); 

      } 
      else 
      { 
       if (!String.IsNullOrEmpty(item.Name)) 
       { 
        dynamic newObject = typeDynamic(project, item.Name); 
        newObject.Save(); 
       } 
      } 
     } 

    } 

답변

0

님의 동적 유형이 될 나중에 (생성자 typeDynamic(...)으로 사용) 실제 유형으로 사용하려고 typeDynamic 정의했다. 그것은 그들이 의도 된 방식이 아니며 점 (typeDynamic.someMember)을 사용하여 회원들에게 액세스하는 것입니다. StaticMembersDynamicWrapper을 사용하여 읽기만하면 정적 멤버 만 생성자에 액세스 할 수 있습니다. 유형을 생성자로 사용하려면 TryInvoke을 StaticMembersDynamicWrapper 클래스에 구현해야합니다. 이것을 클래스에 추가하십시오 :

public override bool TryInvoke(InvokeBinder binder, object[] args, out object result) 
{ 
    ConstructorInfo ctor = _type.GetConstructor(args.Select(arg => arg.GetType()).ToArray()); 
    if (ctor == null) 
    { 
     result = null; 
     return false; 
    } 

    result = ctor.Invoke(args); 
    return true; 
} 

강력하지는 않지만 충분히 효과적 일 수 있습니다. 그러나 나는 ck 나 다른 비 동적 접근법에 의해 제안 된 것처럼 더 간단한 접근법을 강력하게 추천 할 것이다.


다른 동적 인 접근 방식은 정적 함수에 대리자를 사용하는 것입니다. 이 질문에 대한 나의 대답, Curious problem involving generics and static methods을 참조하십시오.

+0

코드에서 코드가 실패합니다. if (! String.IsNullOrEmpty (item.Name)) { 동적 newObject = typeDynamic (project, item.Name); newObject.Save(); } – learning

2

이것은 공유 속성과 필요한 모든 메서드를 노출 한 인터페이스를 선언 한 다음 각 클래스의 인터페이스를 구현하고 인터페이스에서 작동하도록 공유 코드를 작성하면 훨씬 쉬울 것입니다.

관련 문제