C# 扩展自定义Datatable以提供其他方法

C# 扩展自定义Datatable以提供其他方法,c#,C#,我想让它变得简单一点,将DataRow集合的值分配给一些对象的属性 我想这样做: Tabelle t = new Tabelle(query, Id, 1200); foreach (DataRow r in t.Rows) { CustObject b = new CustObject(); r.AssingValue(Columnname, b, PropertyName); } internal class Tabelle : DataTable { Data

我想让它变得简单一点,将
DataRow
集合的值分配给一些对象的属性

我想这样做:

Tabelle t = new Tabelle(query, Id, 1200);

foreach (DataRow r in t.Rows)
{
    CustObject b = new CustObject();

    r.AssingValue(Columnname, b, PropertyName);
}
internal class Tabelle : DataTable
{
    DataTable tabelle = new DataTable();

    internal Tabelle(string abfrage)
    {
        try
        {
            SqlDataAdapter adapter = new SqlDataAdapter((SqlCommand)new Prozedur(abfrage));
            if (adapter.SelectCommand.Connection != null && adapter.SelectCommand.Connection.State == ConnectionState.Open)
            {
                adapter.Fill(this);
            }
        }
    }

    // How can I attach this method to the datarow Collection?
    public void AssingValue(string parametername, object target, string propertyName)
    {
        if (Row.Value != System.DBNull.Value) // how would I access the DataRow Value? 
        {
            var prop = target.GetType().GetProperty(propertyName);
            prop.SetValue(target, Convert.ToDateTime(Row.Value));
        }

    }

}
public void AssingValue(string columnName, object target, string propertyName, int rowIndex)
{
    DataRow row = this.Rows[rowIndex];
    if (row[columnName] != System.DBNull.Value) // how would I access the DataRow Value? 
    {
        var prop = target.GetType().GetProperty(propertyName);
        prop.SetValue(target, Convert.ToDateTime(row[columnName]));
    }

}
该表如下所示:

Tabelle t = new Tabelle(query, Id, 1200);

foreach (DataRow r in t.Rows)
{
    CustObject b = new CustObject();

    r.AssingValue(Columnname, b, PropertyName);
}
internal class Tabelle : DataTable
{
    DataTable tabelle = new DataTable();

    internal Tabelle(string abfrage)
    {
        try
        {
            SqlDataAdapter adapter = new SqlDataAdapter((SqlCommand)new Prozedur(abfrage));
            if (adapter.SelectCommand.Connection != null && adapter.SelectCommand.Connection.State == ConnectionState.Open)
            {
                adapter.Fill(this);
            }
        }
    }

    // How can I attach this method to the datarow Collection?
    public void AssingValue(string parametername, object target, string propertyName)
    {
        if (Row.Value != System.DBNull.Value) // how would I access the DataRow Value? 
        {
            var prop = target.GetType().GetProperty(propertyName);
            prop.SetValue(target, Convert.ToDateTime(Row.Value));
        }

    }

}
public void AssingValue(string columnName, object target, string propertyName, int rowIndex)
{
    DataRow row = this.Rows[rowIndex];
    if (row[columnName] != System.DBNull.Value) // how would I access the DataRow Value? 
    {
        var prop = target.GetType().GetProperty(propertyName);
        prop.SetValue(target, Convert.ToDateTime(row[columnName]));
    }

}

Assign方法应具有输入参数,如
rowIndex
以查找表中的特定行,以及
columnName
以获取/设置行的列值

您可以尝试以下方法:

Tabelle t = new Tabelle(query, Id, 1200);

foreach (DataRow r in t.Rows)
{
    CustObject b = new CustObject();

    r.AssingValue(Columnname, b, PropertyName);
}
internal class Tabelle : DataTable
{
    DataTable tabelle = new DataTable();

    internal Tabelle(string abfrage)
    {
        try
        {
            SqlDataAdapter adapter = new SqlDataAdapter((SqlCommand)new Prozedur(abfrage));
            if (adapter.SelectCommand.Connection != null && adapter.SelectCommand.Connection.State == ConnectionState.Open)
            {
                adapter.Fill(this);
            }
        }
    }

    // How can I attach this method to the datarow Collection?
    public void AssingValue(string parametername, object target, string propertyName)
    {
        if (Row.Value != System.DBNull.Value) // how would I access the DataRow Value? 
        {
            var prop = target.GetType().GetProperty(propertyName);
            prop.SetValue(target, Convert.ToDateTime(Row.Value));
        }

    }

}
public void AssingValue(string columnName, object target, string propertyName, int rowIndex)
{
    DataRow row = this.Rows[rowIndex];
    if (row[columnName] != System.DBNull.Value) // how would I access the DataRow Value? 
    {
        var prop = target.GetType().GetProperty(propertyName);
        prop.SetValue(target, Convert.ToDateTime(row[columnName]));
    }

}

如果我理解正确,您可以通过datarow类本身的扩展方法来实现这一点

public static class DataRowExtensionMethods
{
    public static int ReturnIntForField(this DataRow data, string fieldName)
    {
        return data[fieldName] == DBNull.Value ? 0 : Convert.ToInt32(data[fieldName]);
    }

    public static DateTime ReturnDateTimeFromDataRowField(this DataRow data, string fieldName)
    {
        return Convert.ToDateTime(data[fieldName]);
    }
} \\etc... etc...
然后,我们可以按照以下步骤重新编写datarow循环

foreach (DataRow r in t.Rows)
{
    CustObject b = new CustObject();
    b.PropertyName = r.ReturnIntForField("ColumnName");         
    b.PropertyName1 = r.ReturnDateTimeFromDataRowField("ColumnName1");
}

希望这能有所帮助

谢谢,这很有效。将索引传递回
数据表
,这似乎有点奇怪,因为我分析了同一对象的行集合。我为您提供了另一种解决方案。。如果我理解正确的话!谢谢,这就是我要找的