繁体   English   中英

获取应用于此实例的c#属性?

[英]Get c# attribute applied to this instance?

是否可以从该类中检索应用于类实例的属性的值? 一个例子是:

class Host {
    [XmlElement("NAME")]
    public ChildClass c { get; set; }
}

[Serializable()]
class ChildClass : IXmlSerializable {
    ...
    void IXmlSerializable.WriteXml(XmlWriter writer) {
        OtherClass desiredElement = ...
        string desiredElementName = ???
        XmlSerializer = new XmlSerializer(desiredElement.GetType(), new XmlRootAttribute(desiredElementName));
        serializer.Serialize(writer, desiredElment);
    }
}

desiredElementName应该包含NAME

这不能直接完成,您必须将父项的引用传递给子项。 如果这不是问题,那么有可能:

public class Host {
    public Host()
    {
        c = new ChildClass(this);
    }

    [XmlElement("NAME")]
    public ChildClass c { get; set; }
}

[Serializable()]
public class ChildClass : IXmlSerializable {
    private object _parent { get; }

    public ChildClass(object parent)
    {
        _parent = parent;
    }

    public void IXmlSerializable.WriteXml(XmlWriter writer) {

        var props = _parent.GetType().GetProperties();
        var propElement = props.Where(p => p.PropertyType == GetType()).FirstOrDefault();
        var desiredElementName = propElement.CustomAttributes.FirstOrDefault(p => p.AttributeType == typeof(XmlElementAttribute))?.ConstructorArguments.FirstOrDefault()?.Value;

        var desiredElement = _parent;

        XmlSerializer = new XmlSerializer(desiredElement.GetType(), new XmlRootAttribute(desiredElementName));
        serializer.Serialize(writer, desiredElment);
    }
}

虽然我不确定desiredElement包含你想到的对象。

请注意:我使用.net core 2.0进行了测试。 我不知道反思是否有变化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM