Ich bin kürzlich auf eine sehr einfache Typed DataTable gestoßen (ohne eine .XSD) (Ich habe die URL des Autors verloren, also kann ich ihn nicht gutschreiben), aber es sieht so aus, als gäbe es viel doppelten Code (wie das Add/Entfernen/GetNewRow-Methoden).Handgefertigte stark typisierte ADO.net DataTable - Kann es sauberer sein?
Ich habe versucht, die repetitiven Methoden in eine super Klasse zu schieben, aber ich habe Probleme aufgrund der Mitarbeiter müssen generisch sein. Ich hatte gehofft, StackOverflow's kollektiven Bienenstock Verstand zu bekommen, um einige Ideen vorzuschlagen, um das aufzuräumen? (Wenn es sogar möglich?)
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; }
}
}
}
Wenn Sie .net fwk 2.0 oder höher verwenden, können Sie Generika verwenden. Was ist deine Frage wirklich? Was willst du erreichen? – shahkalpesh
Ich verwende .net 2.0. Ich bin mir nicht 100% ig sicher, wie ich das mit Generika umsetzen kann. Was ich erreichen möchte ist, dass ich Code für die Verwendung von generischen und/oder Vererbungsmodellen verwende. Wenn ich also mehr TypeDataSets (wie zB Employee, Product, Category, etc) erstelle, muss ich keinen Code kopieren und einfügen (Add()/Entferne()/...) in diese anderen Klassen. Aber in der Lage sein, eine neue "Produkt" -Klasse, die mit diesen Methoden kommt, kostenlos zu erstellen. Wenn ich Wiederholungen wie die Employer-Klasse beim Erstellen anderer Typed DataTables auf diese Weise sehe, denke ich, dass es eine weniger repetitive Art geben muss. –