現在、私はこれを持っています:
- エンティティフレームワークによって生成されたモデル部分クラス
- IDataErrorInfoインターフェイスを実装するこのエンティティの私自身の部分クラス
これは機能しますが、とにかくジェネリックコードを他のクラスに移動できますか?最善のアプローチは何ですか?私たちは(Entity Frameworkに移行する前に)「Entity」クラスとPocoを持っていました。このエンティティクラスは、IDataErrorInfoのようにインターフェイスが実装されている基本クラスから拡張されています。部分クラスの他の部分はすでにEntityObjectから拡張されているため、このアプローチを使用することはできませんが、すべての部分クラスを80%同じコードで再度記述するのは愚かです。唯一の「実際の」違いは、Validateメソッドのロジックです。
public partial class Customer : IDataErrorInfo, ICustomer
{
private readonly IDictionary<string, string> _errors = new Dictionary<string, string>();
public Customer()
{
base.
PropertyChanged += Model_PropertyChanged;
}
private void Model_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
Validate();
}
private void Validate()
{
if (Name != null && Name.Equals("Banana"))
{
this[GetPropertyName(() => Name)] = "Some really nice error here";
}
}
#region "IDataErrorInfo"
public virtual string this[string columnName]
{
get
{
if (_errors.ContainsKey(columnName))
{
return _errors[columnName];
}
return null;
}
protected set
{
if (value == null && _errors.ContainsKey(columnName))
{
_errors.Remove(columnName);
}
else
{
if (_errors.ContainsKey(columnName))
_errors[columnName] = value;
else
_errors.Add(columnName, value);
}
}
}
public virtual string Error
{
get
{
if (_errors.Values.Count > 0)
{
return _errors.Values.First();
}
return null;
}
}
#endregion
public static string GetPropertyName<T>(Expression<Func<T>> expression)
{
MemberExpression body = (MemberExpression)expression.Body;
return body.Member.Name;
}
}