2013-04-22 3 views
1

동적 형식을 사용하는 일반 확장 메서드를 호출하려고하지만 오류가 계속 발생합니다. 아래의 코드에서 리플렉션을 사용하여 일반 확장 메서드 호출

GenericArguments[0], 'DifferenceConsole.Name', on 'DifferenceConsole.Difference'1[T] GetDifferences[T](T, T)' violates the constraint of type 'T'.

, 나는 동적 유형을 주석하고 그냥 작동해야 유형 (이름) 하드 코딩하지만이 같은 오류를 얻을 시도했다. 왜 오류가 발생하는지 이해할 수 없습니다. 어떤 충고?

public static class IDifferenceExtensions 
{ 
    public static Difference<T> GetDifferences<T>(this T sourceItem, T targetItem) where T : IDifference, new() 
    { 
     Type itemType = sourceItem.GetType(); 

     foreach (PropertyInfo prop in itemType.GetProperties(BindingFlags.Public | BindingFlags.Instance)) 
     { 
      DifferenceAttribute diffAttribute = prop.GetCustomAttributes(typeof(DifferenceAttribute), false).FirstOrDefault() as DifferenceAttribute; 

      if (diffAttribute != null) 
      { 
       if (prop.PropertyType.GetInterfaces().Contains(typeof(IDifference))) 
       { 
        object sourceValue = prop.GetValue(sourceItem, null); 
        object targetValue = prop.GetValue(targetItem, null); 

        MethodInfo mi = typeof(IDifferenceExtensions) 
         .GetMethod("GetDifferences") 
         .MakeGenericMethod(typeof(Name)); // <-- Error occurs here 
         //.MakeGenericMethod(prop.PropertyType); 

        // Invoke and other stuff 


       } 
       else 
       { 
        // Other stuff 
       } 
      } 
     } 

     //return diff; 
    } 
} 

public class Name : IDifference 
{ 
    [Difference] 
    public String FirstName { get; set; } 

    [Difference] 
    public String LastName { get; set; } 

    public Name(string firstName, string lastName) 
    { 
     this.FirstName = firstName; 
     this.LastName = lastName; 
    } 
} 

public interface IDifference 
{ 

} 

public class Difference<T> where T: IDifference, new() 
{ 
    public T Item { get; set; } 

    public Difference() 
    { 
     Item = new T(); 
    } 
} 

답변

1

Name에는 매개 변수없는 공용 생성자가 없습니다.
그러나 TIDifference, new()으로 제한했습니다. 즉, 제네릭 매개 변수로 사용되는 모든 유형은 IDifference을 구현해야하며 공용 매개 변수없는 생성자가 있어야 함을 의미합니다.

BTW : IDifferenceExtensions은 정적 클래스의 실제 이름이 아닙니다. I 접두어는 일반적으로 인터페이스 용으로 예약되어 있습니다.

+0

Doh! 내 머리 속에는 매개 변수없는 생성자가있었습니다. 나는 그것에 대해 확신했기 때문에 결코 보지 못했습니다. 명명 조언에 너무 감사드립니다! –

관련 문제