DbFieldAttribute というカスタム DB ORM ツールで使用される C# クラスがあります。
次のように、フィールドの上に配置します。
[DbField("User_Id")]
public int UserId{ get; set; }
課題: 属性コンストラクター コードから、属性に関連付けられているフィールドの FieldInfo を取得します。上記の場合、UserId の FieldInfo が返されます。
どんな助けでも素晴らしいでしょう。ありがとう。
DbFieldAttribute というカスタム DB ORM ツールで使用される C# クラスがあります。
次のように、フィールドの上に配置します。
[DbField("User_Id")]
public int UserId{ get; set; }
課題: 属性コンストラクター コードから、属性に関連付けられているフィールドの FieldInfo を取得します。上記の場合、UserId の FieldInfo が返されます。
どんな助けでも素晴らしいでしょう。ありがとう。
残念ながら、私の知る限りでは、あなたが求めていることを達成する方法はありません。
ただし、コンストラクター内で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();
}
}