簡體   English   中英

如何在C#中動態創建類和列表

[英]How to create class and List dynamically in C#

如何在C#中動態創建類和列表,例如:如果我們將數據集傳遞給應該返回列表格式數據的方法

但是在常規模型上,每次我需要創建類和方法時,任何有想法的人都可以共享它。

這是我的常規方法代碼:-

[WebMethod]
    public static List<ICF> ge_Grid_data(string paramstr, string procname)
    {
        #region
        List<ICF> lst = new List<ICF>();
        try
        {
            string[] parameters = paramstr.Split('~');
            string err = string.Empty;
            int len = parameters.Length;
            SqlParameter[] sqlParam = new SqlParameter[len];
            for (int i = 0; i < len; i++)
            {
                string[] paramWithValue = parameters[i].Split('$');
                string param = paramWithValue[0].ToString();
                string value = paramWithValue[1].ToString();
                sqlParam[i] = new SqlParameter { ParameterName = param, Value = value };
            }

            DataSet ds = new clsiCMSBLBase().GetListData(ref err, sqlParam, procname);
            DataTable dt = ds.Tables[0];
            foreach (DataRow dr in dt.Rows)
            {
                ICF obj = new ICF();
                obj.Flag = Convert.ToInt32(dr["Flag"]);
                obj.ClaimID = dr["ClaimID"].ToString();
                obj.RyotNumber = dr["RyotNumber"].ToString();
                obj.SeasonCode = dr["SeasonCode"].ToString();
                obj.PlotNumber = dr["PlotNumber"].ToString();
                obj.RyotNumber = dr["RyotNumber"].ToString();
                obj.RyotName = dr["RyotName"].ToString();
                obj.ClaimDate = dr["ClaimDate"].ToString();
                obj.ClaimFormNo = dr["ClaimFormNo"].ToString();
                obj.ClaimArea = dr["ClaimArea"].ToString();
                obj.ClaimAmount = dr["ClaimAmount"].ToString();
                obj.ClaimReason = dr["ClaimReason"].ToString();
                obj.SurveyorID = dr["SurveyorID"].ToString();
                obj.SurveyorDate = dr["SurveyorDate"].ToString();
                obj.InsuranceAmount = dr["InsuranceAmount"].ToString();

                lst.Add(obj);
            }
        }
        catch (Exception ex)
        {
        }

        return lst;
        #endregion
    }

這是ICF類別:-

public class ICF
    {
        #region
        public int Flag { get; set; }
        public string ClaimID { get; set; }
        public string SeasonCode { get; set; }
        public string PlotNumber { get; set; }
        public string RyotNumber { get; set; }
        public string RyotName { get; set; }
        public string ClaimDate { get; set; }
        public string ClaimFormNo { get; set; }
        public string ClaimArea { get; set; }
        public string ClaimAmount { get; set; }
        public string ClaimReason { get; set; }
        public string SurveyorID { get; set; }
        public string SurveyorDate { get; set; }
        public string InsuranceAmount { get; set; }
        #endregion
    }

我的期望:

    public static class Extensions
{
    /// <summary>
    /// Converts datatable to list<T> dynamically
    /// </summary>
    /// <typeparam name="T">Class name</typeparam>
    /// <param name="dataTable">data table to convert</param>
    /// <returns>List<T></returns>
    public static List<T> ToList<T>(this DataTable dataTable) where T : new()
    {
        var dataList = new List<T>();

        //Define what attributes to be read from the class
        const BindingFlags flags = BindingFlags.Public | BindingFlags.Instance;

        //Read Attribute Names and Types
        var objFieldNames = typeof(T).GetProperties(flags).Cast<PropertyInfo>().
            Select(item => new 
            { 
                Name = item.Name, 
                Type = Nullable.GetUnderlyingType(item.PropertyType) ?? item.PropertyType 
            }).ToList();

        //Read Datatable column names and types
        var dtlFieldNames = dataTable.Columns.Cast<DataColumn>().
            Select(item => new { 
                Name = item.ColumnName, 
                Type=item.DataType 
            }).ToList();

        foreach (DataRow dataRow in dataTable.AsEnumerable().ToList())
        {
            var classObj = new T();

            foreach (var dtField in dtlFieldNames)
            {
                PropertyInfo propertyInfos = classObj.GetType().GetProperty(dtField.Name);

                var field = objFieldNames.Find(x => x.Name == dtField.Name);

                if (field != null)
                {

                    if (propertyInfos.PropertyType == typeof(DateTime))
                    {
                        propertyInfos.SetValue
                        (classObj, convertToDateTime(dataRow[dtField.Name]), null);
                    }
                    else if (propertyInfos.PropertyType == typeof(int))
                    {
                        propertyInfos.SetValue
                        (classObj, ConvertToInt(dataRow[dtField.Name]), null);
                    }
                    else if (propertyInfos.PropertyType == typeof(long))
                    {
                        propertyInfos.SetValue
                        (classObj, ConvertToLong(dataRow[dtField.Name]), null);
                    }
                    else if (propertyInfos.PropertyType == typeof(decimal))
                    {
                        propertyInfos.SetValue
                        (classObj, ConvertToDecimal(dataRow[dtField.Name]), null);
                    }
                    else if (propertyInfos.PropertyType == typeof(String))
                    {
                        if (dataRow[dtField.Name].GetType() == typeof(DateTime))
                        {
                            propertyInfos.SetValue
                            (classObj, ConvertToDateString(dataRow[dtField.Name]), null);
                        }
                        else
                        {
                            propertyInfos.SetValue
                            (classObj, ConvertToString(dataRow[dtField.Name]), null);
                        }
                    }
                }                
            }
            dataList.Add(classObj);
        }
        return dataList;
    }

    private static string ConvertToDateString(object date) 
    {
        if (date == null)
            return string.Empty;

        return SpecialDateTime.ConvertDate(Convert.ToDateTime(date));
    }

    private static string ConvertToString(object value)
    {
        return Convert.ToString(HelperFunctions.ReturnEmptyIfNull(value));
    }

    private static int ConvertToInt(object value) 
    {
        return Convert.ToInt32(HelperFunctions.ReturnZeroIfNull(value));
    }

    private static long ConvertToLong(object value)
    {
        return Convert.ToInt64(HelperFunctions.ReturnZeroIfNull(value));
    }

    private static decimal ConvertToDecimal(object value)
    {
        return Convert.ToDecimal(HelperFunctions.ReturnZeroIfNull(value));
    }

    private static DateTime convertToDateTime(object date)
    {
        return Convert.ToDateTime(HelperFunctions.ReturnDateTimeMinIfNull(date));
    }
}

最后,我需要這樣稱呼它:

List<MyClass> list =  dt.ToList<MyClass>

但是這段代碼不起作用

盡管還不清楚要實現什么,但是可以使用dynamic關鍵字和.Net> = 4的System.Dynamic.ExpandoObject來完成所描述的操作。

在類ICF中創建一個方法

    public class ICF
    {
        public static List<ICF> icfList = new List<ICF>();

        #region
        public int Flag { get; set; }
        public string ClaimID { get; set; }
        public string SeasonCode { get; set; }
        public string PlotNumber { get; set; }
        public string RyotNumber { get; set; }
        public string RyotName { get; set; }
        public string ClaimDate { get; set; }
        public string ClaimFormNo { get; set; }
        public string ClaimArea { get; set; }
        public string ClaimAmount { get; set; }
        public string ClaimReason { get; set; }
        public string SurveyorID { get; set; }
        public string SurveyorDate { get; set; }
        public string InsuranceAmount { get; set; }
        #endregion


        public static void AddRow(DataRow dr)
        {
                ICF obj = new ICF();
                obj.Flag = Convert.ToInt32(dr["Flag"]);
                obj.ClaimID = dr["ClaimID"].ToString();
                obj.RyotNumber = dr["RyotNumber"].ToString();
                obj.SeasonCode = dr["SeasonCode"].ToString();
                obj.PlotNumber = dr["PlotNumber"].ToString();
                obj.RyotNumber = dr["RyotNumber"].ToString();
                obj.RyotName = dr["RyotName"].ToString();
                obj.ClaimDate = dr["ClaimDate"].ToString();
                obj.ClaimFormNo = dr["ClaimFormNo"].ToString();
                obj.ClaimArea = dr["ClaimArea"].ToString();
                obj.ClaimAmount = dr["ClaimAmount"].ToString();
                obj.ClaimReason = dr["ClaimReason"].ToString();
                obj.SurveyorID = dr["SurveyorID"].ToString();
                obj.SurveyorDate = dr["SurveyorDate"].ToString();
                obj.InsuranceAmount = dr["InsuranceAmount"].ToString();

                icfList.Add(obj);
        }
    }

**

我得到了答案這是序列化的數據,可以使用Jquery Ajax方法在HTML頁面中輕松訪問,這是可重用的代碼,例如通用方法,只需傳遞SP名稱,參數,表順序(無論您希望使用第0個表或第一個表),此模型可以用於填充數據到控件或jqx小部件網格綁定..等

**

[WebMethod]
public static String GetRowData_Tables(string procedureName, string paramstr, int table)
{
    string[] parameters = paramstr.Split('~');
    string err = string.Empty;
    int len = parameters.Length;
    SqlParameter[] sqlParam = new SqlParameter[len];
    for (int i = 0; i < len; i++)
    {
        string[] paramWithValue = parameters[i].Split('$');
        string param = paramWithValue[0].ToString();
        string value = paramWithValue[1].ToString();
        sqlParam[i] = new SqlParameter { ParameterName = param, Value = value };
    }

    try
    {
        DataSet ds = new clsiCMSBLBase().GetListData(ref err, sqlParam, procedureName);
        String JSONString = String.Empty;

        //JSONString = Newtonsoft.Json.JsonConvert.SerializeObject(ds, Newtonsoft.Json.Formatting.Indented);

        if (ds.Tables[table].Rows.Count > 0)
        {
            DataTable dt = ds.Tables[table];
            JSONString = Newtonsoft.Json.JsonConvert.SerializeObject(dt, Newtonsoft.Json.Formatting.Indented);
        }

        return JSONString;
    }
    catch (Exception)
    {
        return "Error";
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM