概括一种方法来处理各种对象

时间:2011-07-14 09:59:58

标签: c# visual-studio-2008 reflection casting

在我写的一个程序中,我决定使用自己的数据类型而不是任何其他数据库(用于教育目的)。

数据保存为csv文件,我有一种方法可以将.csv转换为简单的字符串[,]。

每个类X都是自己的字符串[,]到List转换器。 在前3个班级之后,我开始玩泛型和反思。 我确实成功地将一般列表转换为字符串[,],但反过来开始看起来很难。

我实现List to string [,]的方式是:

public string[,] ToArray(object[] sender)
    {
        if (sender.Length==0)
        {

            return null;
        }
        string[,] ret; 
        PropertyInfo[] props;
        if (sender.Length > 0)
        {
            props = sender[0].GetType().GetProperties();
            ret = new string[props.Length, sender.Length];
        }
        else
        {

            return null;
        }
        for (int i=0;i<sender.Length;i++)
        {



            for (int p = 0; p < props.Length; p++)
            {
                object value=props[p].GetValue(sender[i], null);
               if (value!=null) ret[p, i] = value.ToString();

            }


        }
        return ret;


    }

并且让我们说类Windows(字符串名称,双倍大小,布尔百叶窗)

我将数组[,]转换为Windows(非常普遍),如下所示:

public static List<Windows> ToList(string[,] arra)
    {

        List<Windows> ret = new List<Windows>(); // change Windows to anything
        int col = array.GetLength(1);
        int row = array.GetLength(0);

        PropertyInfo[] props=PropArray(new Windows());
        int propslen=props.Length;
        for (int c = 0; c < col; c++)
        {
            Windows entry=new Windows();
            for (int r = 0; r < propslen; r++)
            {
                Type pt = props[r].PropertyType;

                if (pt==typeof(string))
                    props[r].SetValue(entry,array[r,c],null);
                else
                    if (pt==typeof(int))
                    {
                        int i=0;int.TryParse(array[r,c],out i);
                    props[r].SetValue(entry,i,null);
                    }
                else
                    if (pt==typeof(bool))
                    {
                        bool i = false; bool.TryParse(array[r, c], out i);
                    props[r].SetValue(entry,i,null);
                    }
                    else
                        if (pt == typeof(double))
                        {
                            double i = 0; double.TryParse(array[r, c], out i);
                            props[r].SetValue(entry, i, null);
                        }
                    else
                if (pt==typeof(DateTime))
                    {
                        DateTime i = DateTime.MinValue; DateTime.TryParse(array[r, c], out i);
                    props[r].SetValue(entry,i,null);
                    }





            }
            ret.Add(entry);


            }

        return ret;


        }

我需要做的就是FindReplace单词“Windows”到任何其他数据类型,它可以工作。

真正的问题是我如何概括它来接收一个类型并自己创建一个实例列表?

甚至可能吗?

提前致谢, 加布里埃尔

2 个答案:

答案 0 :(得分:0)

我不会万无一失,但你可以使用泛型。类似的东西:

public static List<T> ToList<T>(string[,] arra) // T can be anything
    where T : new()                             // as long as it has a default constructor
{

    List<T> ret = new List<T>();
    int col = array.GetLength(1);
    int row = array.GetLength(0);

    PropertyInfo[] props=PropArray(new T());
    int propslen=props.Length;
    for (int c = 0; c < col; c++)
    {
        T entry=new T();
// ...

答案 1 :(得分:0)

您所做的实际上是一种序列化格式。如果对象是没有复杂引用的值,则序列化格式相对简单。简单的xml或json是常见的格式。也许你应该考虑使用json?

如果您选择“自己滚动”,为什么不尝试使用属性名称作为键?使用类名前缀键/值列表,并在反序列化时实例化对象。示例格式

MyApplication.Person, MyAssembly
Name=Steve
Age=30
MyApplication.Person, MyAssembly
Name=Bob
Age=54

要反序列化,请读取类名,使用FormatterServices.GetUninitializedObject()实例化以获取类的空实例。然后使用该类的属性infos,设置文件后面的键/值对的值。这本质上是一种简化的JSON表示法(不支持列表,地图等)。