反射技術
反射とは
反射とは、運転中にオブジェクト情報を動的に取得する方法です。例えば、実行時に獲得したオブジェクトの属性、方法、依頼などがありますか?
反射の役割
運転が可能な場合は、オブジェクトを動的に呼び出す方法や、属性値の動的設定、取得などが可能です。
反射の例:
(二)特性について
アトリブトとは何ですか?実行時のオブジェクトやオブジェクトの属性、方法、依頼などを説明するクラスです。
アトリエの役割?実行時に、あなたのコードを説明したり、あなたのプログラムに影響を与える行為を行います。
注意:
Attributeがクラスである以上、その定義は定義類と同じです。
唯一の違いは、カスタマイズクラスはSystem.Attributeの空間に引き継がなければなりません。
特性の例:
カスタムAttributeを通じて、クラスの属性とデータベースフィールドの対応関係を定義し、MyStudent類のName、Age属性にはAttributeの記述を加えて、彼らに対応するデータベースフィールド名とタイプを指定します。
コードの変更は以下の通りです。
(三)ORMマッピング規則の定義
エンティティクラスにData FieldAttributeの記述を追加すると、O(オブジェクト)/R(関係データベース)のマッピングルールが追加されます。
次に反射法により、運転時にO/Rを動的に取得します。 Mappingのマッピングルール:
結果を表示:
エンティティクラスの属性名:Name->データベースフィールド名:SNAMeエンティティ類の属性名:Age->データベースフィールド名:SAge
次の仕事は、この方法によってオブジェクトからマッピングルールを動的に取得し、Insert、Update、DeleteなどのSQL文を動的に構成することです。これは自分のORMを実現する原理です。
ここのコードは単なる例ですが、実際にORMを実現するには、多くのことを考慮する必要があります。例えば、1、エンティティ類はどのデータベーステーブルに対応していますか?2、データベーステーブルのPK FKとはどういう意味ですか?…
学習ソース:
反射とは、運転中にオブジェクト情報を動的に取得する方法です。例えば、実行時に獲得したオブジェクトの属性、方法、依頼などがありますか?
反射の役割
運転が可能な場合は、オブジェクトを動的に呼び出す方法や、属性値の動的設定、取得などが可能です。
反射の例:
using System;
using System.Reflection;
namespace CS_Test
{
public class MyStudent
{
private string sName;
public string SName
{
get { return sName; }
set { sName = value; }
}
private int sAge;
public int SAge
{
get { return sAge; }
set { sAge = value; }
}
}
class Test_Attribute
{
[STAThread]
static void Main(string[] args)
{
MyStudent stu1 = new MyStudent();
stu1.SName = " ";
stu1.SAge = 40;
//
PropertyInfo[] pros = stu1.GetType().GetProperties();
//
foreach (PropertyInfo pro in pros)
Console.WriteLine(pro.Name+":"+pro.GetValue(stu1,null));
// stu1 SAge
stu1.GetType().GetProperty("SAge").SetValue(stu1, 30, null);
//
foreach (PropertyInfo pro in pros)
Console.WriteLine(pro.Name+":"+pro.GetValue(stu1, null));
}
}
}
(二)特性について
アトリブトとは何ですか?実行時のオブジェクトやオブジェクトの属性、方法、依頼などを説明するクラスです。
アトリエの役割?実行時に、あなたのコードを説明したり、あなたのプログラムに影響を与える行為を行います。
注意:
Attributeがクラスである以上、その定義は定義類と同じです。
唯一の違いは、カスタマイズクラスはSystem.Attributeの空間に引き継がなければなりません。
特性の例:
// Attribute
public class DataFieldAttribute : Attribute
{
public DataFieldAttribute(string fieldName,string fieldType)
{
this._fieldName = fieldName;
this._fieldType = fieldType;
}
//
private string _fieldName;
public string FieldName
{
get { return _fieldName; }
set { _fieldName = value; }
}
//
private string _fieldType;
public string FieldType
{
get { return _fieldType; }
set { _fieldType = value; }
}
}
カスタムAttributeを通じて、クラスの属性とデータベースフィールドの対応関係を定義し、MyStudent類のName、Age属性にはAttributeの記述を加えて、彼らに対応するデータベースフィールド名とタイプを指定します。
コードの変更は以下の通りです。
public class MyStudent
{
private string _name;
// “ ” 、
[DataFieldAttribute("SName", "varchar")]
public string Name
{
get { return _name; }
set { _name = value; }
}
private int _age;
[DataFieldAttribute("SAge", "int")]
public int Age
{
get { return _age; }
set { _age = value; }
}
}
(三)ORMマッピング規則の定義
エンティティクラスにData FieldAttributeの記述を追加すると、O(オブジェクト)/R(関係データベース)のマッピングルールが追加されます。
次に反射法により、運転時にO/Rを動的に取得します。 Mappingのマッピングルール:
static void Main(string[] args)
{
MyStudent stu1 = new MyStudent();
stu1.Name = " ";
stu1.Age = 40;
//
PropertyInfo[] infos = stu1.GetType().GetProperties();
object[] objs_fieldAttr = null;
foreach (PropertyInfo info in infos)
{
// GetCustomAttributes:
// “ ” ( 、 )
objs_fieldAttr = info.GetCustomAttributes(
typeof(DataFieldAttribute), false);
if (objs_fieldAttr != null)
{
Console.Write(" :" + info.Name);
Console.Write(" -> :");
Console.WriteLine(((DataFieldAttribute)objs_fieldAttr[0]).FieldName);
}
}
}
結果を表示:
エンティティクラスの属性名:Name->データベースフィールド名:SNAMeエンティティ類の属性名:Age->データベースフィールド名:SAge
次の仕事は、この方法によってオブジェクトからマッピングルールを動的に取得し、Insert、Update、DeleteなどのSQL文を動的に構成することです。これは自分のORMを実現する原理です。
ここのコードは単なる例ですが、実際にORMを実現するには、多くのことを考慮する必要があります。例えば、1、エンティティ類はどのデータベーステーブルに対応していますか?2、データベーステーブルのPK FKとはどういう意味ですか?…
学習ソース: