0

我希望能够为几个课程执行以下操作:

var obj1 = new MyClass { Id = 1 };
var obj2 = new MyClass { Id = 2 };
obj1.Compare(obj2);

我做了以下扩展方法(灵感来自一个不同的问题):

public static class ObjExt
{
    public static ICollection<string> Compare<T>(this T obj1, T obj2)
    {
        var properties = typeof(T).GetProperties();
        var changes = new List<string>();

        foreach (var pi in properties)
        {
            var value1 = typeof(T).GetProperty(pi.Name).GetValue(obj1, null);
            var value2 = typeof(T).GetProperty(pi.Name).GetValue(obj2, null);

            if (value1 != value2 && (value1 == null || !value1.Equals(value2)))
            {
                changes.Add(string.Format("Value of {0} changed from <{1}> to <{2}>.", pi.Name, value1, value2));
            }
        }
        return changes;
    }

现在,如果我在要比较的所有类中创建一个方法,这将起作用,所以我想我会将它作为一个超类移动到 DRY。

public class MyClass
{
    public int Id { get; set; }

    public ICollection<string> CompareMe<T>(T obj2)
    {
        return Compare<T>(obj2);
    }
}

如果我将它移动到一个超类,我会得到这个编译错误:

无法将实例类型参数“SuperClass”转换为“T”

如果我在我的超级班上这样做:

return this.Compare<T>(obj2);

我得到一个编译错误说:

无法从用法中推断出方法“Compare(T, T)”的类型参数。尝试明确指定类型参数。

如何在超类中使其通用?

4

3 回答 3

1

不知道你的超级班长什么样。但这编译得很好:

public class SuperClass
{
    public bool GenericTest<T>(T obj2)
    {
       return ObjExt.GenericTest(obj2, obj2);
    }
}

public class MyClass : SuperClass
{
    public int Id { get; set; }

    public bool SuperTest<T>(T obj2)
    {
        return this.GenericTest<T>(obj2);
    }
}

public static class ObjExt
{
    public static bool GenericTest<T>(this T obj1, T obj2)
    {
        return true;
    }
}
于 2012-12-03T16:05:50.090 回答
1

这种扩展方法:

public static bool GenericTest<T>(this T obj1, T obj2)
{
}

不会编译,因为编译器不知道到底是什么T:没有上下文可以推断类型。您要么需要使用类似的东西,where T: SuperClass要么将方法参数更改为this SuperClass obj1, SuperClass obj2.

于 2012-12-03T16:14:03.557 回答
1

您可以在方法上添加通用约束SuperTest

public bool SuperTest<T>(T obj2) where T: SuperClass
            {
                return this.GenericTest(obj2);
            }

T在扩展方法中替换为SuperClass

public static bool GenericTest(this SuperClass obj1, SuperClass obj2)
        {
            return true;
        }

我不确定这是否是您的想法。

于 2012-12-03T16:14:11.260 回答