我希望能够为几个课程做以下事情:
var obj1 = new MyClass { Id = 1 };
var obj2 = new MyClass { Id = 2 };
obj1.Compare(obj2);
我制作了以下扩展方法(inspired by a different question inhere):
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)'的类型参数。尝试明确指定类型参数。
如何在超类中制作这个泛型?
答案 0 :(得分: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;
}
}
答案 1 :(得分:1)
此扩展方法:
public static bool GenericTest<T>(this T obj1, T obj2)
{
}
不会编译,因为编译器不知道T
究竟是什么:没有上下文来推断类型。您需要使用where T: SuperClass
之类的内容或将方法参数更改为this SuperClass obj1, SuperClass obj2
。
答案 2 :(得分: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;
}
我不确定这是不是你的想法。