c# - 如何在类级别从 PropertyInfo 获取 DataContract 属性?

标签 c# .net reflection

我有一个扩展方法,我使用它尝试从对象中提取一些元数据,例如:

public static string ToTypeName(this object obj)
{
    string name;
    var asType = obj.GetType();
    if (Attribute.IsDefined(asType, typeof(DataMemberAttribute)) || Attribute.IsDefined(asType, typeof(DataContractAttribute)))
    {
        var attrName = obj.GetType().GetCustomAttributes(typeof(DataContractAttribute), true).SingleOrDefault() as DataContractAttribute;
        name = string.IsNullOrEmpty(attrName.Name) ? asType.Name : attrName.Name;
    }
    else
    {
        name = asType.Name;
    }
    return name;
}

我目前正在使用它从装饰有各种属性的对象中提取元数据。在此示例中,它正在查找 DataContractAttribute,然后从 Name 属性中提取值。这很好用。

但是,有时该对象属于 PropertyInfo 类型。发生的事情是 Attribute.IsDefined 测试为真,因此进入要抓取的 block ,但是,它无法转换,因此 attrName 为空。

我在前一个 block 之前添加了这个 block :

if (obj is PropertyInfo)
{
    var asPropInfo = obj as PropertyInfo;
    if (Attribute.IsDefined(asPropInfo, typeof(DataMemberAttribute)) || Attribute.IsDefined(asPropInfo, typeof(DataContractAttribute)))
    {
        var attrName = asPropInfo.GetType().GetCustomAttributes(typeof(Attribute), true).SingleOrDefault();
        if (attrName is DataMemberAttribute)
        {
            var attr = attrName as DataMemberAttribute;
            name = string.IsNullOrEmpty(attr.Name) ? asType.Name : attr.Name;
        }
        else if (attrName is DataContractAttribute)
        {
            var attr = attrName as DataContractAttribute;
            name = string.IsNullOrEmpty(attr.Name) ? asType.Name : attr.Name;
        }
    }
}

IsDefined 检查仍在测试为真,但仍无法转换。我通过监视变量查看了 objCustomAttributes 属性(当它进入方法时),它显示了 1 个 DataContractAttribute 类型的属性,但是,当我到达 asPropInfo.GetType() 时,它已更改为 Serializable

可能是我在这方面做得太久了,我没有想清楚,但是有人有任何意见吗?

更新: 我能够删除 GetType() 并直接调用 GetCustomAttributes(),但是,结果仍然不是我需要的。这是似乎正在发生的事情:

假设一个 Person 类包含一个 Person 类型的成员,如下所示:

[DataContract(Name = "Employee")]
public class PersonDto{
    public string FirstName {get;set;}
    public string LastName {get;set;}

    [DataMember(Name = "Boss")]
    public Person Supervisor {get;set;}
}

抓取过程中发生的事情是 Supervisor 作为 PropertyInfo 连同它的 DataMember 属性被传入,我的扩展正在读取它并返回“Boss”,这完全有道理。但是,在这个阶段我真正需要的是 DataContract 属性,原因如下:

Supervisor 属性被序列化时,它将序列化为“Boss”,我需要知道这一点,所以我将其保存到 DTO。但是,我还需要知道“Boss”是序列化的“类型”,即“Employee”。这可能看起来很奇怪,但最终还是有道理的,哈哈。我正在使用它来帮助为我们的 API 生成帮助文档。在内部,类类型可能是“PersonDto”,但显示给客户端的类型是“Employee”。所以在帮助文档方面,开发人员知道有一个“Boss”元素,但他们还需要知道它只是“Employee”的一个实例(就他们而言),以便他们可以查找该对象的文档。这有意义吗?

最佳答案

我相信您不需要对 asPropInfo 调用 GetType。试试看:

var attrName = asPropInfo.GetCustomAttributes(typeof(Attribute), true).SingleOrDefault();

关于c# - 如何在类级别从 PropertyInfo 获取 DataContract 属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16328864/

相关文章:

c# - 取消关闭 outlook 窗体区域

c# regex 和 [] expression ,为什么 [+*/-] 无法解析?

asp.net - 在 bin 文件夹外的 ASP.NET 项目中解析程序集

c# - 如何在本地测试 Azure Functions 身份验证

c# - Appfabric 缓存未命中数

c# - c# 定时器自然是多线程的吗?

c# - 无法在 WPF C# 代码中获取对 png 作品的引用

c# - C++ .NET DLL 与 C# 托管代码? (文件加密 AES-128+XTS)

c# - Type.GetType ("System.Net.WebException")返回 null

java - 反射 - 将对象即时转换到未知的父类(super class)?