1

私はリフレクションについてあまり詳しくありませんが、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;
    }
}

これにより、コード ファーストで生成されたすべてのクラスを調べてこの小さな機能を実装する代わりに、時間を節約できます。

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 に答える