我最近遇到一个非常简单的类型化数据表(不使用 .XSD)(我丢失了作者的 URL,所以我不能相信他),但看起来有很多重复的代码(例如添加/删除/ GetNewRow 方法)。
我尝试将重复的方法推入超类中,但由于 Employee 需要通用,因此出现了问题。我希望 StackOverflow 的集体思维能提出一些想法来清理这个问题? (如果有可能的话?)
using System;
using System.Data;
using System.Collections;
using System.Data.SqlClient;
namespace TypedDataSet {
public class Employees : DataTable {
protected SqlDataAdapter _adapter;
public Employees() {
string connectionString = TypedDataSet.Properties.Settings.Default.ConnectionString;
_adapter = new System.Data.SqlClient.SqlDataAdapter("SELECT Id, Firstname, Surname FROM Employee", connectionString);
_adapter.Fill(this);
}
public Employee this[int index] {
get { return (Employee)Rows[index]; }
}
public void Add(Employee row) {
Rows.Add(row);
}
public void Remove(Employee row) {
Rows.Remove(row);
}
public Employee GetNewRow() {
Employee row = (Employee)NewRow();
return row;
}
protected override DataRow NewRowFromBuilder(DataRowBuilder builder) {
return new Employee(builder);
}
public IEnumerator GetEnumerator() {
return Rows.GetEnumerator();
}
protected override Type GetRowType() {
return typeof(Employee);
}
}
public class Employee : DataRow {
internal Employee(DataRowBuilder builder)
: base(builder) {
}
public Int64 Id {
get { return (Int64)base["Id"]; }
set { base["Id"] = value; }
}
public string FirstName {
get { return (string)base["Firstname"]; }
set { base["Firstname"] = value; }
}
public string Surname {
get { return (string)base["Surname"]; }
set { base["Surname"] = value; }
}
}
}
我相信我已经回答了我的问题。我必须使用 .net 4.0 才能获得我所希望的结果dynamic type.
因此,更改问题中的现有类:
员工.cs
using System;
using System.Data;
using System.Collections;
using System.Data.Common;
namespace TypedDataSet {
public class Employees : BaseModel<Employee> {
public Employees(bool loadAll) {
DbDataAdapter adapter = base.Adapter("SELECT * FROM Employees");
adapter.Fill(this);
}
protected override DataRow NewRowFromBuilder(DataRowBuilder builder) {
return new Employee(builder);
}
}
public class Employee : DataRow {
internal Employee(DataRowBuilder builder)
: base(builder) {
}
public Int64 Id {
get { return (Int64)base["Id"]; }
set { base["Id"] = value; }
}
public string FirstName {
get { return (string)base["Firstname"]; }
set { base["Firstname"] = value; }
}
public string Surname {
get { return (string)base["Surname"]; }
set { base["Surname"] = value; }
}
}
}
现在引入上面类继承的BaseModel
基础模型.cs
using System;
using System.Data;
using System.Collections;
using System.Data.Common;
using System.Data.SqlClient;
namespace TypedDataSet {
public class BaseModel<T> : DataTable {
protected DbDataAdapter _adapter;
protected string _connectionString = TypedDataSet.Properties.Settings.Default.ConnectionString;
public BaseModel() {
}
protected DbDataAdapter Adapter(string sql) {
_adapter = new System.Data.SqlClient.SqlDataAdapter(sql, _connectionString);
SqlCommandBuilder cb = new SqlCommandBuilder((SqlDataAdapter)_adapter);
return _adapter;
}
public dynamic this[int index] {
get { return Rows[index]; }
}
public void Add(dynamic row) {
Rows.Add(row);
}
public void Remove(dynamic row) {
Rows.Remove(row);
}
public void Save() {
_adapter.Update(this);
this.AcceptChanges();
}
public dynamic GetNewRow() {
dynamic row = (dynamic)NewRow();
return row;
}
public IEnumerator GetEnumerator() {
return Rows.GetEnumerator();
}
protected override Type GetRowType() {
return typeof(T);
}
}
}
这允许我使用以下代码使用该类:
Employees employees = new Employees(true);
Employee employee = employees.GetNewRow();
employee.FirstName = "Greg";
employee.Surname = "Focker";
employees.Add(employee);
employees.Save();
foreach (Employee e in employees) {
Console.WriteLine(e.FirstName + ' ' + e.Surname);
}
我希望能进一步发展这个项目,所以如果你对这个小项目感兴趣的话,未来的 StackOverflow 用户可以看看http://bitbucket.org/Mozketo/typeddataset/ http://bitbucket.org/Mozketo/typeddataset/我希望在其中托管代码。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)