私はこのGeneric DuplicateValidationRuleの動作を試しています。これは、基本的に(渡された汎用ビジネスオブジェクト型に基づいて)重複をチェックします。例えばIBankAccountビジネスオブジェクトを取ることができます:一般的なDuplicateValidationRule(重複しているビジネスオブジェクトのチェック)
T =てBusinessObjectタイプクラス(人、住所、銀行口座の、:
public interface IBankAccount : IMyBusinessObjectBase
{
IBank Bank
{
get;
set;
}
IBankAccountType BankAccountType
{
get;
set;
}
string AccountName
{
get;
set;
}
string AccountNumber
{
get;
set;
}
DateTime EffectiveDate
{
get;
set;
}
}
は、私がIBankAccount
次のコレクションIBankAccount acc1 = new BankAccount();
acc1.AccountName = "Account1";
acc1.AccountNumber = "123456";
acc1.Bank = FetchBusinessObjectByID(1); //Fetch Bank 1
IBankAccount acc2 = new BankAccount();
acc2.AccountName = "Account2";
acc2.AccountNumber = "654321";
acc2.Bank = FetchBusinessObjectByID(1); //Fetch Bank 1
IBankAccount acc3 = new BankAccount();
acc3.AccountName = "Account3";
acc3.AccountNumber = "123456";
acc3.Bank = FetchBusinessObjectByID(2); //Fetch Bank 2
IBankAccount acc4 = new BankAccount();
acc4.AccountName = "Account3";
acc4.AccountNumber = "123456";
acc4.Bank = FetchBusinessObjectByID(1); //Fetch Bank 2
ICollection<IBankAccount> bankAccounts = new List<IBankAccount>();
bankAccount.Add(acc1);
bankAccount.Add(acc2);
bankAccount.Add(acc2);
bankAccount.Add(acc4);
パラメータを持っているとしましょうBank、BankBranchなど)string [] entityPropertyName =重複をチェックするときに含めるプロパティの配列。
次に、以下のシナリオを使用してください。アカウント番号と銀行を確認して、重複した銀行口座を確認したいとします。口座番号は銀行内で一意ですが、別の銀行にも存在する可能性があります。したがって、上記のリストを見ると、Acc1、Acc2、Acc3が有効です。その銀行の口座番号が既に存在するため、Acc4は無効です。
したがって、validateの呼び出しは次のようになります。
DuplicateValidationRule.Validate(newBankAccountEntry、new string [] {"AccountNumber"、 "Bank.Name"});
上記のコードは、重複をチェックするビジネスエンティティと、チェックするプロパティを含むプロパティ配列を渡します。
public ValidationError Validate<T>(T entityProperty, string[] entityPropertyName)
{
ICollection<T> businessObjectList = FetchObjectsByType<T>();
bool res = true;
for (int i = 0; i < entityPropertyName.Length; i++)
{
object value = getPropertyValue(entityProperty, entityPropertyName[i]);
//By Using reflection and the getPropertyValue method I can substitute the properties to //compare.
if (businessObjectList.Any(x => getPropertyValue(x, entityPropertyName[i]).Equals(value) &&
x.GetType().GetProperty("ID").GetValue(x,null).ToString()
!= ((IBusinessObjectBase)entityProperty).ID.ToString()))
res &= true;
else
res &= false;
}
if (res)
return new ValidationError(_DuplicateMessage);
else
return ValidationError.Empty;
}
この方法は、上の重複をチェックするために実際のオブジェクトを取得するために使用されます。
private static object getPropertyValue(object obj, string propertyName)
{
string[] PropertyNames = propertyName.Split('.');
object propertyValue = obj;
for (int i = 0; i < PropertyNames.Length; i++)
{
propertyValue = propertyValue.GetType().GetProperty(PropertyNames[i], BindingFlags.Public |
BindingFlags.Instance | BindingFlags.Static | BindingFlags.FlattenHierarchy).
GetValue(propertyValue, null);
}
if (propertyValue.GetType() == typeof(string))
return propertyValue.ToString().ToLower(CultureInfo.CurrentCulture);
else
return propertyValue;
}
上記のコードの作品を、それが欠陥を持っている:あなたがチェックしている場合、上記のコードのみ動作します
DuplicateValidationRule.Validate<IBankAccount>(newBankAccountEntry,new string[] {"AccountNumber"});
あなたは、たとえば、に対してチェックするために、別のプロパティを追加します:
012重複した試合のための単一のプロパティこのコードでは、リスト内の次のoccurangeの2番目のプロパティがチェックされます。比較対象の現在のオブジェクトの.Anyのすべてのプロパティをテストする必要があります。これがうまくいくことを願って、誰かが私にこれを解決するためのアドバイスをくれますか?ありがとう:)
あなたのコードがうまくいくかのように見えます。私の現在の解決策を投稿させてください。うまくいけば、使用する方が良いと思われるユーザー入力があります。どうもありがとう!! – FaNIX