1

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

我认为它可能不需要以下实现

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;
    }
}

这只会节省一些时间,而不必遍历所有代码优先生成的类并实现这个小功能。

4

1 回答 1

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; } }
于 2013-11-13T19:24:01.827 回答