无法访问我的对象的成员

时间:2016-02-03 12:10:52

标签: c# winforms oop object

  

错误:'对象'不包含' lp'的定义没有扩展方法>' lp'接受类型'对象'的第一个参数。可以找到(你是否缺少>使用指令或汇编参考?

如果我尝试从我的对象中获取值,我会得到这个......

enter image description here

但是当我在没有尝试获取值的情况下运行时,我可以清楚地看到我的对象确实包含lp ...

enter image description here

反序列化的完整代码......

public object Deserialize(Object obj, string path)

        {

            XmlSerializer serializer = new XmlSerializer(obj.GetType());

            StreamReader reader = new StreamReader(path);
            obj = serializer.Deserialize(reader);
            reader.Close();
            return obj;

        }

人类......

public class Person
    {
        public string name { get; set; }
        public int age { get; set; }

    }

PersonList类......

public class PersonList

    {
        public List<Person> lp = new List<Person>();


        public void AddPerson(Person p)
        {
            lp.Add(p);
        }
    }

它是我发送到公共类PersonList

的人员列表的一个实例
{
    public List<Person> lp = new List<Person>();


    public void AddPerson(Person p)
    {
        lp.Add(p);
    }
}.
  

更新:之前我正在进行投射,但是我将传递大量不同类型的对象,因此需要一个通用的反序列化函数。有没有办法做到这一点? -

4 个答案:

答案 0 :(得分:1)

您的obj变量被声明为对象实例。在Deserialize中进行强制转换:

var obj = (PersonList)serializer.Deserialize(reader);

答案 1 :(得分:1)

您的obj具有对象的类型,因此您只能使用 object 类的常规方法。你应该把obj强制转换为你需要的类型。例如:

obj = (PersonList)serializer.Deserialize(reader);
obj = serializer.Deserialize(reader) as PersonLis;

您还可以使用运算符来检查 obj 是否属于 PersonList

答案 2 :(得分:1)

您通过请求进行通用演员表来更新您的问题,而Generics正是您正在寻找的。

public T Deserialize<T>(T obj, string path)
{
    XmlSerializer serializer = new XmlSerializer(typeof(T));

    StreamReader reader = new StreamReader(path);
    obj = (T)serializer.Deserialize(reader);
    reader.Close();
    return obj;
}

答案 3 :(得分:1)

您可以为XmlSerializer编写扩展方法以使用通用反序列化:

public static class Extension
{
    public static T Deserialize<T>(this XmlSerializer serializer, StreamReader streamReader)
    {
        try
        {
            return (T) serializer.Deserialize(streamReader);
        }
        catch (InvalidCastException)
        {
            return default(T);
        }
    }
}

然后通过以下方式调用它:

XmlSerializer serializer = new XmlSerializer(obj.GetType());
StreamReader reader = new StreamReader(path);

var deserialized = serializer.Deserialize<PersonList>(reader);

reader.Close();