我想创建一个通用的保存方法,它应该像这样工作;
Entity.User.User user = new Entity.User.User();
user.FirstName = "A";
user.LastName = "B";
user.UserName = "C";
user.Save();
public class User : BaseClass<User>
{
public virtual int UserId { get; set; }
public virtual string UserName { get; set; }
public virtual string Password { get; set; }
public virtual string FirstName { get; set; }
public virtual string LastName { get; set; }
//I WANT THIS METHOD TO BE GENERIC UNDER BASE CLASS
//public void Save()
//{
// CREATE.New(this);
//}
}
public partial class BaseClass<T>
{
public void Save(this T x)
{
CREATE<T>.New(x);
}
}
public class CREATE<T>
{
public static void New(T x)
{
//some code
}
}
但是我得到&#34的错误;扩展方法必须在非通用的静态类中定义&#34;
寻找管理这项工作的指南。谢谢
答案 0 :(得分:3)
与所有&#34;实体共享保存方法&#34;你既不需要Generic Parent类,也不需要扩展方法。
它只是一个简单的继承:
public class User : BaseClass
{
public int UserId { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
public class BaseClass
{
public void Save()
{
//put save logic here. Should match for all
//concrete implementations of BaseClass
}
}
现在你可以简单地调用
User user = new User();
user.FirstName = "A";
user.LastName = "B";
user.UserName = "C";
user.Save();
一般来说,你希望继承树中的每个类都保存它自己的属性,然后调用父的save(),这样你就不必一遍又一遍地重复自我。
具体实施取决于您如何保存。如果它只是一个序列化,你可以在BaseClass上坚持使用一个全局保存方法,并且子节点不需要在save()上提供任何实现。
即。要构建一个字符串,你可以这样做:所以EACH Class只提供它负责的部分:
public class User : BaseClass
{
public string UserName { get; set; }
public string Password { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public override String Save(){
s = base.Save(); //recall base.Save() as long as its not the topmost-entity
//attach Username, password, firstname, lastname
return s;
}
}
public class BaseClass
{
public int Id { get; set; }
public virtual String Save()
{
String s = "";
//attach id to s
return s;
}
}
现在调用userInstance.Save()
会返回一个包含所有变量的字符串,包括基类的id。 (如果你有一个复杂的树,这会变得很方便,每个班级应该对它自己的属性负责。)
实际上,您不会构建字符串,但可能是XML-Element或Prepared Statement准备与数据库一起运行。
答案 1 :(得分:1)
使用您的通用方法,我认为您所追求的是:
public partial class BaseClass<T>
{
public virtual void Save()
{
// only support the T : BaseClass<T> scenario, so
// we expect "this" to be a T
CREATE<T>.New((T)(object)this);
}
}
答案 2 :(得分:0)
您需要将CREATE类更改为:
public static class CREATE
{
public static void New<T>(this T x)
{
//some code
}
}
这是你的扩展方法,它们需要在一个静态的非泛型类中。就像你指出的错误一样。
您需要将Save
方法更改为:
public void Save(T x)
{
x.Save();
}
这会调用保存扩展方法。由于基类是通用的而且是非静态的,因此它不能包含扩展方法。