Я нашел решение для своей проблемы :).
Теперь я могу расширить SubSonic функциональностью, которая мне нужна в шаблонах, без необходимости перестраивать или изменять какой-либо код SubSonic.
Это работает для того, что я хотел сделать, и я думаю, что это может быть полезно для других, так что вот оно:
Создать новую библиотеку классов SubSonicHelper. У моего класса есть класс, похожий на этот:
using System;
using System.Collections.Generic;
using System.Text;
namespace Helpers.SubSonic
{
public class GeneratorHelper
{
public bool IsColumnAllowed(string columnName)
{
return columnName.Length == 1 ||
(columnName.Length > 1 &&
(!(columnName[0].ToString().Equals("_") &&
columnName[columnName.Length - 1].ToString().Equals("_"))))
}
}
}
- Сборка сборки и копирование SubSonicHelper.dll в ваш дозвуковой проект.
- Настройте проект SubSonic на использование собственных шаблонов с помощью параметра templateDirectory.
Отредактируйте свои собственные шаблоны и в следующем после const bool showGenerationInfo = false;
System.Reflection.Assembly a = System.Reflection.Assembly.LoadFile(
System.IO.Path.Combine(System.IO.Directory.GetCurrentDirectory(), "SubSonicHelper.dll"));
object instance = a.CreateInstance("Helpers.SubSonic.GeneratorHelper");
Type type = instance.GetType();
После этого у вас есть экземпляр GeneratorHelper, который вы можете использовать внутри шаблона. Для доступа к методам вам необходимо сделать следующее:
- Создайте массив объектов для параметров метода, который вы хотите использовать. У меня есть параметр columnName, который я установил в col.propertyName. Это внутри цикла foreach (TableSchema.TableColumn col в столбцах) в методе Update.
- Вызвать метод, который вы хотите использовать с массивом объектов в качестве аргумента.
Проверьте объект результата, чтобы увидеть результат метода.
object[] arg = new object[]{col.PropertyName};
object isColumnAllowedResult = type.InvokeMember("IsColumnAllowed", System.Reflection.BindingFlags.Default | System.Reflection.BindingFlags.InvokeMethod, null, instance, arg);
if (Convert.ToBoolean(isColumnAllowedResult))
Вот и все! Теперь я могу расширить класс SubSonicHelper другими методами, которые я хочу использовать внутри шаблона.