Я использую отражение, чтобы сделать некоторые запросы к базе данных и в создании делегатов ускорить использование отражения немного я наткнулся на следующее сообщение об ошибке:Ошибка при связывании общий метод делегата - Подпись или безопасности Прозрачность
Cannot bind to the target method because its signature or security transparency is not compatible with that of the delegate type.
У меня есть два метода, которые создают этих делегатов, как с аналогичными структурами, но один работает, а другой нет. Единственное существенное различие между ними заключается в том, что тот, который не работает, имеет больше параметров и возвращает список с общим типом, где, поскольку рабочий принимает только один параметр и возвращает одно значение объявленного типа, а не общее T .
Вот пример кода:
Метод
public List<T> GetConnections<T>(IElement element, bool getChildren, bool getParents) where T : IConnectionTable, new()
{
// do some database stuff and return a List<T> where the constraints on
// T follow the method description above.
}
Создание делегата
упрощенный для ясности
private Func<IElement, bool, bool, List<IConnectionTable>> GetConnectionsDelegate(string connectionType)
{
// Get the type element from the passed string.
Type elementType = Type.GetType(connectionType, true);
// Create the generic method using that type.
MethodInfo method = typeof(MyClass).GetMethod("GetConnections", new Type[]{ typeof(IElement), typeof(bool), typeof(bool) });
MethodInfo generic = method.MakeGenericMethod(elementType);
// Create a delegate of the method to speed up subsequent queries.
var converted = (Func<IElement, bool, bool, List<IConnectionTable>>)Delegate.CreateDelegate(typeof(Func<IElement, bool, bool, List<IConnectionTable>>), this, generic);
// the above line is where it dies
}
Реальный код сохраняет делегат в частный статический словарь, так что я только должен использовать отражение один раз.
Если я распечатать содержимое метода и родового все это, кажется, правильно преобразованы.
Result StandardOutput:
System.Collections.Generic.List`1[T] GetConnections[T](MyProject.Database.IElement, Boolean, Boolean)
System.Collections.Generic.List`1[MyTestProject.TestConnection] GetConnections[TestConnection](MyProject.Database.IElement, Boolean, Boolean)
Мое предположение, что проблемы лежат в различии между родовым List против типов возврата IConnectionTable списка, но сделать метод возвращающим необщего списка результаты в большом количестве ошибок отлитых в родовой методе и что-то нехорошо делать. Кроме того, этот код работает нормально при тестировании.
Она не должна быть разница между частными и государственными методами, как другие мои методы создания делегата одинаковы и работают отлично (я также попытался изменить GetConnectionsDelegate публике, и это не имеет никакого значения.)
Любая помощь будет очень признательна.
NDH
Вы создаете делегатов, чтобы ускорить некоторые накладные расходы, а не запросы db? –
Да, это ускорить отражение. Думаю, это не имеет значения, что я делаю с самим кодом. –
Спасибо. Ну, иногда его использование в перспективе может быть полезно ... –