我有三个班级A,B和C, 有些属性属于所有三个类,有些属性不是
public class A
{
public string Firstname {get; set;}
public string Lastname {get; set;}
public int ID {get; set;}
public int xxx {get; set} // only in class A
public int yyy{get; set} // only in class A
...
}
public class B
{
public string Firstname {get; set;}
public string Lastname {get; set;}
public int ID {get; set;}
public int aaa {get; set} // only in class B
public int bbb {get; set} // only in class B
...
}
public class C
{
public string Firstname {get; set;}
public string Lastname {get; set;}
public int ID {get; set;}
public int kkk {get; set} // only in class C
public int ppp {get; set} // only in class C
...
}
我想调用类XYZ的执行方法......
public class XYZ
{
public override Execute<T>() where T: Generic_T, new()
{
T abc = new T();
...
Debug.WriteLine(abc.Firstname + ”, “ + abc.Lastname + “, “ + abc.ID);
}
}
...所有三个类,如:
XYZ x1 = new XYZ();
XYZ.Execute<A>();
XYZ x2 = new XYZ();
XYZ.Execute<B>();
XYZ x3 = new XYZ();
XYZ.Execute<C>();
我的想法不起作用:
public class Generic_T
{
public static implicit operator A(Generic_T x)
{
return (A)x.MemberwiseClone();
}
}
错误在哪里?
提前致谢!
答案 0 :(得分:2)
错误:
CloneMemberwise()
? MemberwiseClone()
,你就不能在那里打电话。这是protected
成员。T.Firstname
,T.Lastname
等Debug
,而不是Degub
。Execute
方法。 Generic_T
派生的,因此对Execute方法的约束会失败。()
结尾。您已经重新编辑了class A()
。A
或任何类无法自动转换为Generic_T
。Generic_T
应该是基类。可能的建议:
public abstract class Generic_T
{
public string Firstname {get; set;}
public string Lastname {get; set;}
public int ID {get; set;}
}
public class A : Generic_T
{
public int xxx {get; set} // only in class A
public int yyy{get; set} // only in class A
...
}
public class B : Generic_T
{
public int aaa {get; set} // only in class B
public int bbb {get; set} // only in class B
...
}
public class C : Generic_T
{
public int kkk {get; set} // only in class C
public int ppp {get; set} // only in class C
...
}
此外,没有理由将任何派生类转换为Generic_T
,因为它们已经是Generic_T
的实例。
所有这些信息通常都在C#/ .NET的大多数介绍性文章中进行了解释。不了解它们会让你的生活变得悲惨。
答案 1 :(得分:0)
不知道为什么在代码中需要Generic_T。 要强制执行工作,您需要实现以下接口
interface IFoo
{
int ID {get; set;}
string LastName {get; set;}
string FirstName {get; set;}
}
然后你的execute方法将如下所示:
public override Execute<T>(T obj) where T: new(), IFoo
{
Debug.WriteLine(obj.Firstname + ”, “ + obj.Lastname + “, “ + obj.ID);
}