У меня есть частичный класс с использованием интерфейса, потому что я не могу наследовать то, что было оригинальным абстрактным классом из-за того, что другой частичный класс был автоматически сгенерирован из Entity Framework 4 и поэтому уже наследует ObjectContext.Inherited C# Class Losing "Reference"
У меня есть следующие для моего разделяемого класса:
namespace Model
{
using Microsoft.Practices.EnterpriseLibrary.Validation;
using Microsoft.Practices.EnterpriseLibrary.Validation.Validators;
using Utilities.BusinessRules;
using Utilities.BusinessRules.Rules;
[HasSelfValidation]
public partial class MyObject : IBusinessObject
{
private readonly IBusinessObject businessObject = new BusinessObject();
private IBusinessObject BusinessObject
{
get
{
return businessObject;
}
}
public Comment()
{
AddRule(new ValidateRequired("Title"));
}
public void AddRule(BusinessRule rule)
{
BusinessObject.AddRule(rule);
}
[SelfValidation]
public void Validate(ValidationResults results)
{
BusinessObject.Validate(results);
}
}
}
Вот интерфейс:
namespace Utilities.BusinessRules
{
using Microsoft.Practices.EnterpriseLibrary.Validation;
public interface IBusinessObject
{
void AddRule(BusinessRule rule);
void Validate(ValidationResults results);
}
}
И реализация:
namespace Utilities.BusinessRules
{
using System.Collections.Generic;
using System.Linq;
using Microsoft.Practices.EnterpriseLibrary.Validation;
using Microsoft.Practices.EnterpriseLibrary.Validation.Validators;
public class BusinessObject : IBusinessObject
{
private readonly IList<BusinessRule> businessRules = new List<BusinessRule>();
public void AddRule(BusinessRule rule)
{
this.businessRules.Add(rule);
}
[SelfValidation]
public void Validate(ValidationResults results)
{
foreach (var rule in this.businessRules)
{
if (!rule.Validate(this))
{
results.AddResult(new ValidationResult(rule.ErrorMessage, this, rule.Key, rule.Tag, null));
}
}
}
}
}
Не беспокойтесь о правилах, они работают. Проблема в том, что если я использую абстрактный класс в тестовом проекте, метод Validate() в BusinessObject будет правильно идентифицировать (это) как любой класс, унаследованный от абстрактного класса (в этом примере я бы ожидал, что это MyObject). К сожалению, переход на интерфейс (это) теряет наследующий класс и вместо этого идентифицирует это как BusinessObject.
Как это сделать, чтобы класс наследования был правильно идентифицирован?
Вот вызова консоли класс:
namespace ModelConsumer
{
using Model;
using System;
using Microsoft.Practices.EnterpriseLibrary.Validation;
class Program
{
static void Main(string[] args)
{
using (var myEntities = new MyEntities())
{
var myObject= new MyObject();
myObject.Title = "Credo";
var validationResults = Validation.Validate(myObject);
if (validationResults.IsValid)
{
myEntities.MyObjects.AddObject(myObject);
//myEntities.SaveChanges();
Console.WriteLine("Valid.");
}
else
{
foreach (var validationResult in validationResults)
{
Console.WriteLine(validationResult.Message);
}
}
Console.Read();
}
}
}
}
Это должно быть действительным, но вместо этого будет недействительна, потому что (это) идентифицируется как тип BusinessObject вместо MyObject.
Argh! Я так близко, это довольно неприятно.
Ричард
Почему 'public Comment()' не имеет типа возврата? – leppie
Это конструктор, поэтому не имеет типа возврата. – Richard