クラスインスタンスから自動的にSQLステートメントを生成したいです。メソッドはUpdate(object [] Properties、object PrimaryKeyProperty)のようになります。このメソッドはインスタンスの一部です(クラス、基本メソッド - すべての子に共通)。プロパティの配列はクラスプロパティの配列です。これはで使用されます。更新ステートメント。プロパティ名はテーブルフィールド名と同じです。
問題は、私がプロパティ名を取得できないことです。
クラスインスタンス内でプロパティ名を取得するためのオプションはありますか? サンプル:
public class MyClass {
public int iMyProperty { get; set; }
public string cMyProperty2 { get; set; }
{
main() {
MyClass _main = new MyClass();
_main.iMyProperty.*PropertyName* // should return string "iMyProperty"
{
私はPropertyInfoを知っていますが、GetProperties()配列からプロパティのIDを取得するのが辛いことは知りません。
なにか提案を?
この実装を書いただけで先週の火曜日に私達のユーザーグループのためにラムダについてのプレゼンテーションをしてください。
できるよ
MembersOf< Animal> .GetName(x => x.Status)
または
var a = new Animal() a.MemberName(x => x.Status)
コード:
public static class MembersOf<T> {
public static string GetName<R>(Expression<Func<T,R>> expr) {
var node = expr.Body as MemberExpression;
if (object.ReferenceEquals(null, node))
throw new InvalidOperationException("Expression must be of member access");
return node.Member.Name;
}
}
私は完璧な解決策を見つけましたこの郵便受け
public static string GetPropertyName<T>(Expression<Func<T>> propertyExpression)
{
return (propertyExpression.Body as MemberExpression).Member.Name;
}
そして使用法のために:
var propertyName = GetPropertyName(
() => myObject.AProperty); // returns "AProperty"
魅力のように働く
あなたはこのようなことをすることができます:
Type t = someInstance.getType();
foreach (MemberInfo mi in t.GetMembers())
{
if (mi.MemberType == MemberTypes.Property)
{
Console.WriteLine(mi.Name);
}
}
のすべてのプロパティ名を取得するinstance
のタイプ
あなたはPropertyInfo.Nameを使ってプロパティの名前(私はそれがあなたがIDによって意味するものであると仮定します)を得ることができます。 typeof(className).GetProperties()から返されたPropertyInfo []をループするだけです。
foreach (PropertyInfo info in typeof(MyClass).GetProperties())
{
string name = info.Name;
// use name here
}
あなたが望む特定のプロパティへの明示的なハンドルをすでに持っているので、あなたは名前を知っています - あなたはただそれをタイプすることができますか?
これであなたが探しているものが得られるかどうかは100%わからない、これはあなたのクラスの中で[Column]属性を持つすべてのプロパティを取得するだろう: データコンテキストでは、私は持っています:
public ReadOnlyCollection<MetaDataMember> ColumnNames<TEntity>( )
{
return this.Mapping.MappingSource.GetModel(typeof(DataContext)).GetMetaType(typeof(TEntity)).DataMembers;
}
クラス内のプロパティであるテーブルcolumn-namesを取得します。
MyDataContext db = GetDataContext();
var allColumnPropertyNames = db.ColumnNames<Animal>().Where(n => n.Member.GetCustomAttributes(typeof(System.Data.Linq.Mapping.ColumnAttribute), false).FirstOrDefault() != null).Select(n => n.Name);
と言いましょう(最初のサンプルから、クラスのメソッド更新MyClass
):
public class MyClass {
public int iMyStatusProperty { get; set; }
public int iMyKey { get; set; }
public int UpdateStatusProperty(int iValue){
this.iMyStatusProperty = iValue;
return _Update( new[iMyStatusProperty ], iMyKey); // this should generate SQL: "UPDATE MyClass set iMyStatusProperty = {iMyStatusProperty} where iMyKey = {iMyKey}"
}
{iMyStatusProperty}
そして{iMyKey}
クラスインスタンスのプロパティ値です。
だから、問題はプロパティ名を取得する方法です(反射プロパティ名を文字列として使用せずにプロパティから(フィールド名の入力ミスを避けるため)。
MembersOf<T>.GetName<R>(Expression<Func<T,R>> expr)
とMembersOf.GetName<T>(Expression<Func<T,Object>> expr)
これは簡単で、特定のRタイプは必要ありません(コンパイル時に推測される場合でも)。 - Yves M.