根据对象实例的属性值查找其属性

本文关键字:属性 查找 对象 实例 | 更新日期: 2023-09-27 17:52:40

我有一个DTO,看起来像这样:

public class MyDto
{
    [MyAttribute("attribute1")]
    public string Property1 {get;set;}
    [MyAttribute("attribute2")]
    public string Property2 {get;set;}
}

如果我有string "attribute1",我如何使用它来获得MyDto实例中Property1的值?

根据对象实例的属性值查找其属性

使用反射。不幸的是,没有办法从属性中获得属性:您必须遍历每个属性并检查其属性。

不是最健壮的代码,但是试试这个:

public class MyAttributeAttribute : Attribute
{
    public MyAttributeAttribute(string value)
    {
        Value=value;
    }
    public string Value { get; private set; }
}
public class MyDto
{
    [MyAttribute("attribute1")]
    public string Property1 { get; set; }
    [MyAttribute("attribute2")]
    public string Property2 { get; set; }
}
class Program
{
    static void Main(string[] args)
    {
        MyDto dto=new MyDto() { Property1="Value1", Property2="Value2" };
        string value=GetValueOf<string>(dto, "attribute1");
        // value = "Value1"
    }
    public static T GetValueOf<T>(MyDto dto, string description)
    {
        if(string.IsNullOrEmpty(description))
        {
            throw new InvalidOperationException();
        }
        var props=typeof(MyDto).GetProperties().ToArray();
        foreach(var prop in props)
        {
            var atts=prop.GetCustomAttributes(false);
            foreach(var att in atts)
            {
                if(att is MyAttributeAttribute)
                {
                    string value=(att as MyAttributeAttribute).Value;
                    if(description.Equals(value))
                    {
                        return (T)prop.GetValue(dto, null);
                    }
                }
            }
        }
        return default(T);
    }
}