C# 使用反射调用泛型扩展方法

C# 使用反射调用泛型扩展方法,c#,generics,reflection,extension-methods,C#,Generics,Reflection,Extension Methods,我试图用动态类型调用一个泛型扩展方法,但我一直得到一个错误 genericalarguments[0],'DifferenceConsole.Difference'1[T]GetDifferences[T](T,T)'上的'DifferenceConsole.Name'违反了'T'类型的约束。 在下面的代码中,我尝试注释掉动态类型,只是硬编码一个应该可以工作的类型(Name),但我得到了相同的错误。我不明白为什么我会出错。有什么建议吗 public static class IDifferenc

我试图用动态类型调用一个泛型扩展方法,但我一直得到一个错误

genericalarguments[0],'DifferenceConsole.Difference'1[T]GetDifferences[T](T,T)'上的'DifferenceConsole.Name'违反了'T'类型的约束。

在下面的代码中,我尝试注释掉动态类型,只是硬编码一个应该可以工作的类型(Name),但我得到了相同的错误。我不明白为什么我会出错。有什么建议吗

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();
    }
}
公共静态类IDifferenceExtensions
{
公共静态差异GetDifferences(此T sourceItem,T targetItem),其中T:IDIfferences,new()
{
Type itemType=sourceItem.GetType();
foreach(itemType.GetProperties(BindingFlags.Public | BindingFlags.Instance)中的PropertyInfo属性)
{
DifferenceAttribute diffAttribute=prop.GetCustomAttributes(typeof(DifferenceAttribute),false)。FirstOrDefault()作为DifferenceAttribute;
if(diffAttribute!=null)
{
if(prop.PropertyType.GetInterfaces()包含(typeof(IDifference)))
{
object sourceValue=prop.GetValue(sourceItem,null);
对象targetValue=prop.GetValue(targetItem,null);
MethodInfo mi=typeof(IDifferenceExtensions)
.GetMethod(“GetDifferences”)

.MakeGenericMethod(typeof(Name));//
Name
没有公共的无参数构造函数。
但是,您将
T
约束为
IDifference,new()
,这意味着用作泛型参数的每个类型都必须实现
IDifference
,并且必须具有公共的无参数构造函数


顺便说一句:
IDifferenceExtensions
对于静态类来说是一个非常糟糕的名称。
I
前缀通常是为接口保留的。

name
没有公共的、无参数的构造函数。
但是,您将
T
约束为
IDifference,new()
,这意味着用作泛型参数的每个类型都必须实现
IDifference
,并且必须具有公共的无参数构造函数


顺便说一句:
IDifferenceExtensions
对于静态类来说是一个非常糟糕的名字。
I
前缀通常是为接口保留的。

Doh!在我的头脑中,它确实有一个无参数构造函数。我非常确信它,我从来没有费心去寻找过。谢谢你的命名建议!Doh!在我的头脑中,它确实有一个无参数构造函数r、 我是如此确信,我从来没有费心去看。也谢谢你的命名建议!