C# Can';无法访问我的对象';s成员

C# Can';无法访问我的对象';s成员,c#,winforms,oop,object,C#,Winforms,Oop,Object,错误:“对象”不包含“lp”的定义,并且找不到接受“object”类型的第一个参数的扩展方法>“lp”(是否缺少>using指令或程序集引用) 如果我尝试从我的对象中得到一个值,我会得到这个 但是,当我不尝试获取值而运行时,我可以清楚地看到我的对象确实包含lp 反序列化的完整代码 public object Deserialize(Object obj, string path) { XmlSerializer serializer = new X

错误:“对象”不包含“lp”的定义,并且找不到接受“object”类型的第一个参数的扩展方法>“lp”(是否缺少>using指令或程序集引用)

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

但是,当我不尝试获取值而运行时,我可以清楚地看到我的对象确实包含lp

反序列化的完整代码

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; }

    }
个人类

public class PersonList

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


        public void AddPerson(Person p)
        {
            lp.Add(p);
        }
    }
公共类个人列表
{
public List lp=新列表();
公众人士(p人)
{
lp.Add(p);
}
}
这是我发送到公共类PersonList的Person列表的一个实例

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


    public void AddPerson(Person p)
    {
        lp.Add(p);
    }
}.
{
public List lp=新列表();
公众人士(p人)
{
lp.Add(p);
}
}.
更新:我以前做过强制转换,但我将传入不同类型的对象,因此需要一个通用的反序列化函数。有什么方法可以做到这一点吗?-


您的obj变量已声明为对象实例。请执行反序列化强制转换:

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

您的obj变量已声明为对象实例。请执行反序列化强制转换:

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

您的obj的类型为对象,因此您只能使用对象类的常规方法。您应该将obj强制转换为所需的类型。例如:

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

您还可以使用is操作符检查您的对象是否属于PersonList

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

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

您还可以使用is运算符检查您的obj是否属于PersonList类您通过请求泛型转换更新了您的问题,而泛型正是您想要的

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;
}
public T反序列化(T对象,字符串路径)
{
XmlSerializer serializer=新的XmlSerializer(typeof(T));
StreamReader=新的StreamReader(路径);
obj=(T)序列化程序。反序列化(读取器);
reader.Close();
返回obj;
}

您通过请求泛型转换更新了您的问题,而泛型正是您想要的

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;
}
public T反序列化(T对象,字符串路径)
{
XmlSerializer serializer=新的XmlSerializer(typeof(T));
StreamReader=新的StreamReader(路径);
obj=(T)序列化程序。反序列化(读取器);
reader.Close();
返回obj;
}

您可以为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);
        }
    }
}
公共静态类扩展
{
公共静态T反序列化(此XmlSerializer序列化程序、StreamReader StreamReader)
{
尝试
{
返回(T)序列化程序。反序列化(streamReader);
}
捕获(无效卡斯特例外)
{
返回默认值(T);
}
}
}
然后通过以下方式进行调用:

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

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

reader.Close();
XmlSerializer serializer=新的XmlSerializer(obj.GetType());
StreamReader=新的StreamReader(路径);
var deserialized=serializer.Deserialize(读取器);
reader.Close();

您可以为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);
        }
    }
}
公共静态类扩展
{
公共静态T反序列化(此XmlSerializer序列化程序、StreamReader StreamReader)
{
尝试
{
返回(T)序列化程序。反序列化(streamReader);
}
捕获(无效卡斯特例外)
{
返回默认值(T);
}
}
}
然后通过以下方式进行调用:

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

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

reader.Close();
XmlSerializer serializer=新的XmlSerializer(obj.GetType());
StreamReader=新的StreamReader(路径);
var deserialized=serializer.Deserialize(读取器);
reader.Close();

XmlSerializer.Deserialize()
返回
object
(它是在泛型不是.NET的一部分时引入的)。只需将其转换为
obj
类型:
var obj=(PersonList)序列化程序。反序列化(reader);
变量正确地包含该类型的实例,但编译器在编译时无法知道它。
XmlSerializer.Deserialize()
返回
object
(它是在泛型不是.NET的一部分时引入的)。只需将其强制转换为
obj
类型:
var obj=(PersonList)序列化程序。反序列化(reader);
变量正确地包含该类型的实例,但编译器在编译时无法知道它。感谢您的响应,我以前是这样做的,但我将传入不同类型的对象的加载,因此需要一个通用的反序列化函数。有没有办法做到这一点?所有不同的对象类型是否都包含property
lp
?那么您的代码是正确的(反序列化函数).Do cast稍后,在调用反序列化之后。感谢您的响应,我以前是这样做的,但我将传入不同类型的对象,因此需要一个通用的反序列化函数。有什么方法可以做到这一点吗?所有不同的对象类型是否都包含属性
lp
?那么您的代码是正确的(您的反序列化函数)。请稍后在调用反序列化后执行强制转换。我将删除
obj
参数。它的唯一目的是提供类型。用户必须手动指定类型。我将删除
obj
参数。它的唯一目的是提供类型。然后用户必须手动指定类型。