通用方法和这个

时间:2014-07-03 07:32:08

标签: c# generics

我想创建一个通用的保存方法,它应该像这样工作;

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;

寻找管理这项工作的指南。谢谢

3 个答案:

答案 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();
}

这会调用保存扩展方法。由于基类是通用的而且是非静态的,因此它不能包含扩展方法。