检测类的属性以推断属性?

时间:2013-11-13 19:17:34

标签: c# entity-framework reflection

我不太熟悉反射,但是,如果该类具有与某个属性关联的属性,是否可以实现一个返回object的方法?

我认为这可能会使以下实施不需要

public interface IEntity
{
    object ID { get; }
}
public class Person : IEntity
{
    [Key]
    public int PersonID { get; }
    public string Name { get; set; }
    public int Age { get; set; }

    object IEntity.ID
    {
        get { return PersonID; }
    }
}

因此,不是为每个类实现'IEntity',你可以这样做:

public abstract class EntityBase
{
    public object ID { get { return FindPrimaryKey(); } }

    protected object FindPrimaryKey()
    {
        object key = null;
        try
        {
            //Reflection magic
        }
        catch (Exception) { }
        return key;
    }
}

这样可以节省一些时间,而不必通过所有代码优先生成的类并实现这个小功能。

1 个答案:

答案 0 :(得分:2)

是的,绝对可以做到。请考虑以下代码:

protected object FindPrimaryKey()
{
    object key = null;
    var prop = this.GetType()
                   .GetProperties()
                   .Where(p => Attribute.IsDefined(p, typeof(Key)))
    if (prop != null) { key = prop.GetValue(this); }
    return key;
}

但是,我建议缓存该值。为键值添加私有字段:

object _keyValue;

然后设置:

protected void FindPrimaryKey()
{
    var prop = this.GetType()
                   .GetProperties()
                   .Where(p => Attribute.IsDefined(p, typeof(Key)))
    if (prop != null) { _keyValue = prop.GetValue(this); }
}

然后返回:

public object ID { get { return _keyValue; } }