在将对象作为参数时如何为属性类赋值?

时间:2013-11-27 14:50:44

标签: c#

很抱歉,如果标题没有反映出我真正想要的内容。

我正在创建一个通用类,用于从数据库中选择,更新,插入和删除日期。

基本上,我想要一个函数,它给我一个ObservableCollection<“可以是任何东西”> ==>什么都是一个类而不是字符串。我想知道是否可以这样做,如果有,请帮助我如何实现这一目标。

这是我的出发点:

// class a

    public static ObservableCollection<ContactPerson> contactPersons = new ObservableCollection<ContactPerson>();

    public static ObservableCollection<ContactPerson> getContactPerson()
    {
        contactPersons = (ObservableCollection<ContactPerson>)DBConnection.GetDataOutDatabase(typeof(ContactPerson), "Contactpersoon");

        return contactPersons;
    }

// class b

        public static Object GetDataOutDatabase(Type myType,String table)
    {            
        ObservableCollection<Object> objecten = new ObservableCollection<Object>();

        string sql = "SELECT * FROM " + table;
        DbDataReader reader = Database.GetData(sql);

        while (reader.Read())
        {
            objecten.Add(Create(myType, reader));
        }

        return objecten;
    }

    private static Object Create(Type myType, IDataRecord record)
    {
        PropertyInfo[] myPropertyInfo = myType.GetProperties(BindingFlags.Public | BindingFlags.Instance);

        for (int i = 0; i < myPropertyInfo.Length; i++)
        {
            PropertyInfo myPropInfo = (PropertyInfo)myPropertyInfo[i];
            String name = myPropInfo.Name;
            Type type = myPropInfo.PropertyType;
        }

        return null;
    }

这就是我最终想要得到的。这可能吗?

        //ContactPerson cp = new ContactPerson();
        //cp.ID = (record["ID"].ToString());
        //cp.Name = record["Name"].ToString();
        //cp.Company = record["Company"].ToString();
        //cp.JobTitle = new ContactPersonTitle()
        //{
        //    Name = record["JobTitle"].ToString(),
        //};
        //cp.JobRole = new ContactPersonType()
        //{
        //    Name = record["JobRole"].ToString(),
        //};
        //cp.City = record["City"].ToString();
        //cp.Email = record["Email"].ToString();
        //cp.Phone = record["Phone"].ToString();
        //cp.Cellphone = record["Cellphone"].ToString();

非常感谢!

2 个答案:

答案 0 :(得分:0)

不像你现在这样做。您应该查看允许转换数据库表数据集的实体框架。

看看: http://www.codeproject.com/Articles/363040/An-Introduction-to-Entity-Framework-for-Absolute-B

答案 1 :(得分:0)

你可以用泛型方法中的反射实际做到这一点。

public class DBConnection
{
    public static ObservableCollection<T> GetDataOutDatabase<T>(string table)
    {
        var objecten = new ObservableCollection<T>();
        string sql = "SELECT * FROM " + table;
        DbDataReader reader = Database.GetData(sql);

        while (reader.Read())
        {
            objecten.Add(Create<T>(reader));
        }
        return objecten;
    }

    public static T Create<T>(IDataRecord record)
    {
        var properties = typeof(T).GetProperties();
        var returnVal = Activator.CreateInstance(typeof(T));
        properties.ToList().ForEach(item =>
            {
                try
                {
                    if (item.PropertyType.IsPrimitive)
                    {
                        item.SetValue(returnVal, Convert.ChangeType(record[item.Name].ToString(), item.PropertyType),null);
                    }
                    else
                    {
                        object[] parameters = {record};
                        var value =
                        typeof(DBConnection).GetMethod("Create").MakeGenericMethod(item.PropertyType).Invoke(null, parameters);
                        item.SetValue(returnVal,value,null);
                    }
                }
                catch
                {
                    Write("Property Not Found");
                }
            });
        return (T)returnVal;
    }
}

上面的示例假定所有属性名称都与您从数据库通信中检索的列名称相匹配。例如,在上面的ContactPersonTitle而不是Name中,您需要将JobTitle作为属性名称。