Задумка кажется не работает, простой код
Я написал простой кусок кода для участия в Afterthought, но он не работает, и я понятия не имею, почему. Огромная часть этого взята из другого SO вопроса: Как реализовать простое изменение свойств с помощью Afterthought.
using System;
using System.Collections.Generic;
using Afterthought;
namespace SecondAmendmentTest
{
class Program
{
public class TestUser
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public bool HasChanged { get; set; }
public void method()
{
Console.WriteLine("method");
}
}
public class TestUserAmmendment<T> : Amendment<T, T> where T : TestUser
{
public TestUserAmmendment()
{
Properties
.AfterSet((instance, x, y, z, a) => instance.HasChanged = true);
Methods.After(ExceptionMethod);
}
private object ExceptionMethod(T instance, string method, object[] parameters, object result)
{
throw new NotImplementedException();
}
}
static void Main(string[] args)
{
TestUser tu = new TestUser();
Console.WriteLine("Has changed: " + tu.HasChanged.ToString());
Console.WriteLine("Performing changes...");
tu.Id = 5;
tu.FirstName = "name";
tu.LastName = "lastname";
Console.WriteLine("Has changed: " + tu.HasChanged.ToString());
tu.method();
Console.ReadKey();
}
}
}
Он компилируется, но в выходной исполняемый файл не вносятся никакие изменения. Я настроил событие пост-сборки. Построить вывод:
1>------ Rebuild All started: Project: SecondAmendmentTest, Configuration: Debug Any CPU ------
1> SecondAmendmentTest -> C:\Users\Lukasz\Documents\Visual Studio 11\Projects\SecondAmendmentTest\SecondAmendmentTest\bin\Debug\SecondAmendmentTest.exe
1> Amending SecondAmendmentTest.exe (5,559 seconds)
========== Rebuild All: 1 succeeded, 0 failed, 0 skipped ==========
И, наконец, вывод из приложения после запуска:
C:\Users\Lukasz\Documents\Visual Studio 11\Projects\SecondAmendmentTest\SecondAmendmentTest\bin\Debug>SecondAmendmentTest.exe
Has changed: False
Performing changes...
Has changed: False
method
Не было изменено ни свойство HasChanged, ни исключение NotImplementedException. Я использую последние источники из Git. У вас есть идеи, почему это не работает?
РЕДАКТИРОВАТЬ: Вот полное решение: http://dl.dropbox.com/u/1014611/SecondAmendmentTest.zip
2 ответа
Я знаю, что это год спустя, но:
Чтобы развить ответ Виллема ван Кетвича, на самом деле в Afterthought.NET была ошибка (недосмотр?), Которая не позволяла изменять вложенные типы, если их родительский тип не изменялся.
Я отправил запрос на удаление, исправляющий ошибку.
В дополнение к этому исправлению вам все еще нужно [Amendment(typeof(TestUserAmmendment<>))]
в вашем вложенном классе, чтобы вызвать поправку.
Я получил это на работу, сделав две вещи:
Переместите классы TestUser и TestUserAmmendment из класса Program, чтобы они не были вложенными.
Добавьте атрибут
[Amendment(typeof(TestUserAmmendment<>))]
в класс TestUser.
Рабочее решение можно найти здесь.