1

DbFieldAttribute というカスタム DB ORM ツールで使用される C# クラスがあります。

次のように、フィールドの上に配置します。

[DbField("User_Id")]
public int UserId{ get; set; }

課題: 属性コンストラクター コードから、属性に関連付けられているフィールドの FieldInfo を取得します。上記の場合、UserId の FieldInfo が返されます。

どんな助けでも素晴らしいでしょう。ありがとう。

4

2 に答える 2

0

残念ながら、私の知る限りでは、あなたが求めていることを達成する方法はありません。

ただし、コンストラクター内でPropertyInfoまたはFieldInfoオブジェクトを取得する必要がなく、代わりにメソッドに渡されることで満足できる場合は、可能な解決策があります。

まず、DbFieldクラスを次のように定義する必要があります。

class DbField : Attribute
{
    public DbField(string source) { }

    public void GetInstance(PropertyInfo source)
    {
        Console.WriteLine(source.Name);
    }
}

次に、 DbField属性でマークされたすべての (この場合) プロパティを取得し、それらをGetInstance (PropertyInfo)メソッドに渡す次のクラスを定義する必要があります。

class ActivateAttributes
{
    public ActivateAttributes(object source)
    {
        source.GetType()
              .GetProperties()
              .Where(x => x.GetCustomAttributes().OfType<DbField>().Any())
              .ToList()
              .ForEach(x => (x.GetCustomAttributes().OfType<DbField>().First() as DbField).GetInstance(x));
    }
}

このプロセスをトリガーする方法は、そのように定義された抽象クラス内にあります。

abstract class AbstractDecoratedClass
{
    public AbstractDecoratedClass()
    {
        new ActivateAttributes(this);
    }
}

DbField属性で修飾されたプロパティを持つターゲット クラスは、コンストラクター内での呼び出しに煩わされないように、このクラスから派生するだけで済みます。

class DecoratedClass : AbstractDecoratedClass
{
    [DbField("User_Id")]
    public int UserId { get; set; }

    [DbField("User_Id2")]
    public int UserId2 { get; set; } 
}

ここに示すように、ソリューションをテストするだけです。

class Program
{
    static void Main()
    {
        new DecoratedClass();

        Console.Read();
    }
}
于 2013-07-20T00:42:01.193 に答える