无论是是自写的生成器或者是用EF等ORM工具生成的实体类都可能会涉及不满足业务使用的情况
1.属性不足需要自定义增加
因为代码都是根据生成器所产生的,那么每一次生成都会更新覆盖,所以不能再原有生成类的基础上进行增加,需要使用到 c# 关键字 partial 扩展类增加自定义属性及方法,可自行百度。
public partial class UserModel
{
int _UserType;
/// <summary>
/// 用户类别ID
/// </summary>
public int UserType
{
get
{
return _UserType;
}
set
{
_UserType = value;
}
}
string _UserTypeName;
/// <summary>
/// 用户类别名称
/// </summary>
public string UserTypeName
{
get
{
return _UserTypeName;
}
set
{
_UserTypeName = value;
}
}
}
2.扩展类中的某一个属性根据计算而设置值
例如上面的代码,UserType为我们定义枚举值,用户分类ID, 1为一般人员 2为高级用户 99为超级管理员,UserTypeName 的值是根据UserType 计算而来。 并且UserType和UserTypeName都是由ORM生成而来,UserTypeName取值默认为空,需要手工计算对应值。根据实际业务不同,计算的复杂程度业务不同,但是方法一致,无论如何我们都会懒的每次去计算管理UserTypeName的对应值!除非只是一次而已,那该怎么办?
这里我们使用到 继承、virtual、override去解决
首先创建父类并定义两个 虚方法 分别是 get过滤器 set过滤器
public class BaseModel
{
public virtual void GetFilter(string name, object value)
{
}
public virtual void SetFilter(string name, object value)
{
}
}
然后修改我们的ORM工具继承此父类,并在属性的 get set 方法 前后分别增加调用我们在父类定义的虚方法,重新生成,代码如下
public partial class UserModel : BaseModel
{
int _UserType;
/// <summary>
/// 用户类别ID
/// </summary>
public int UserType
{
get
{
GetFilter("UserType", _UserType);
return _UserType;
}
set
{
_UserType = value;
SetFilter("UserType", _UserType);
}
}
string _UserTypeName;
/// <summary>
/// 用户类别名称
/// </summary>
public string UserTypeName
{
get
{
GetFilter("UserTypeName", _UserTypeName);
return _UserTypeName;
}
set
{
_UserTypeName = value;
SetFilter("UserTypeName", _UserTypeName);
}
}
}
接着我们模拟业务处理中的扩展实体类需求发生,我们需要手工计算管理UserTypeName 属性为空的数据,我们创建一个创建一个UserModel的扩展类,实现父类中定义的虚方法。注意:扩展类与原类必须在同一个命名空间!
public partial class UserModel
{
//实现父方法
public override void GetFilter(string name, object value)
{
if (name == "UserTypeName")
{
if (_UserType == 1)
{
_UserTypeName = "一般用户";
}
else if (_UserType == 2)
{
_UserTypeName = "高级用户";
}
else if (_UserType == 99)
{
_UserTypeName = "超级管理员";
}
}
}
//实现父方法
public override void SetFilter(string name, object value)
{
}
string _UserFullName;
//可以扩展自定义属性和自定义方法
public string UserFullName
{
get { return _UserFullName; }
set { _UserFullName = value; }
}
}
其中的计算管理就由你的业务来掌控吧!
public void OnGet()
{
UserModel objUser1 = new UserModel();
objUser1.UserType = 1;
Console.WriteLine(objUser1.UserTypeName);
UserModel objUser2 = new UserModel();
objUser2.UserType = 2;
Console.WriteLine(objUser2.UserTypeName);
UserModel objUser3 = new UserModel();
objUser3.UserType = 3;
Console.WriteLine(objUser3.UserTypeName);
}
最后输出控制台可以看一下结果!