いつもお世話になっております。
いつも回答して頂き助かっています
回答を頂いて無事解決しました。
最終的なコードは1番下に載せています
開発環境は以下の通りです
VS2017
NETFramework,Version=v4.5.21
下記のラムダ内のn => n.Furigana部分のプロパティ名をリフレクションで対応したいのですが
できますか?
C#
1return db.Entry(_validationObject).Property(n => n.Furigana).GetValidationErrors();
下記のようにしたら
System.ArgumentException が発生しました
HResult=0x80070057
Message=The expression passed to method Property must represent a property defined on the type 'Company'.
パラメーター名:property
Source=EntityFramework
スタック トレース:
場所 System.Data.Entity.Internal.DbHelpers.ParsePropertySelector[TEntity,TProperty](Expression1 property, String methodName, String paramName) 場所 System.Data.Entity.Infrastructure.DbEntityEntry
1.Property[TProperty](Expression`1 property)
場所
C#
1return db.Entry(_validationObject).Property(n => n.GetType().GetProperty("Furigana").GetValue(n)).GetValidationErrors();
ちなみに、以下のとおりにすると正しく出力されています
C#
1Debug.WriteLine(_validationObject.GetType().GetProperty("Furigana").GetValue(_validationObject));
下記が全体のコードです。
リフレクションで対応できればコード量がグッと減るんですけど・・・。
private void _dgv_CellValidating(object sender, DataGridViewCellValidatingEventArgs e) { var names = _dgv.Columns[e.ColumnIndex].Name.Split('-'); // 0 クラス名、1 プロパティ名 var t = _asm.GetType(this.GetType().Namespace + "." + names[0]); var method = t.GetMethod("Validate" + names[1]); if (method != null) { dynamic cellEx = _dgv[e.ColumnIndex, e.RowIndex]; cellEx.ErrorText = ""; var errors = (ICollection<DbValidationError>)method.Invoke(null, new object[] { _db, e.FormattedValue }); if (errors.Count != 0) { foreach (var err in errors) { cellEx.ErrorText += err.ErrorMessage + "\n"; } cellEx.ErrorText = cellEx.ErrorText.TrimEnd('\n'); } } }
C#
1 public static ICollection<DbValidationError> ValidateName(SeikouDbContext db, dynamic value) 2 { 3 _validationObject.Name = value; 4 return db.Entry(_validationObject).Property(n => n.Name).GetValidationErrors(); 5 } 6 7 public static ICollection<DbValidationError> ValidateFurigana(SeikouDbContext db, dynamic value) 8 { 9 _validationObject.Furigana = value; 10 return db.Entry(_validationObject).Property(n => n.Furigana).GetValidationErrors(); 11 } 12 13
上記のValiate~メソッドがプロパティごとにあります。
以下が解決した最終的なコードです。
Valiate~メソッドを作る必要がなくなりました
C#
1 private void _dgv_CellValidating(object sender, DataGridViewCellValidatingEventArgs e) 2 { 3 dynamic cellEx = _dgv[e.ColumnIndex, e.RowIndex]; 4 5 var names = _dgv.Columns[e.ColumnIndex].Name.Split('-'); // 0 クラス名、1 プロパティ名 6 typeof(U).GetProperty(names[1]).SetValue(_validationObject, e.FormattedValue); 7 var errors = _db.Entry(_validationObject).Property(names[1]).GetValidationErrors(); 8 9 cellEx.ErrorText = ""; 10 foreach (var err in errors) 11 { 12 cellEx.ErrorText += err.ErrorMessage + "\n"; 13 } 14 if (errors.Count != 0) 15 { 16 cellEx.ErrorText = cellEx.ErrorText.TrimEnd('\n'); 17 e.Cancel = true; 18 _dgv.EndEdit(); 19 _dgv.InvalidateCell(cellEx); 20 } 21 }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/03/08 03:31