【问题标题】:Get c# attribute applied to this instance?获取应用于此实例的 c# 属性?
【发布时间】:2018-06-21 02:32:11
【问题描述】:

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

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

【问题讨论】:

  • 您可以使用反射来获取具有所需属性的属性,然后根据需要提取信息。
  • @Nkosi 如何在不了解Host 的情况下专门针对应用于类定义的特定实例的属性执行此操作 - 只有ChildClass 中的代码?
  • 哦,好的。不。那我看错了要求。

标签: c# reflection attributes componentmodel


【解决方案1】:

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

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 对此进行了测试。不知道反射有没有变化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多