Является ли ошибка, которую Delegate.CreateDelegate не может связать, чтобы структурировать переопределения членов? - PullRequest
5 голосов
/ 01 декабря 2010

После ответа на этот вопрос я обнаружил, что мне нужно использовать параметр ref для вызова метода экземпляра на структурах. Как я могу создать открытый Делегат из метода экземпляра структуры?

Я не могу связать переопределения методов, такие как явные реализации интерфейса (чтобы избежать связанных с боксом штрафов (которые действительно переопределяются)что касается IL)) Вот сообщение об ошибке, в котором говорится, что в будущей версии .NET мы можем связать элементы интерфейса, найденные в структуре: https://connect.microsoft.com/VisualStudio/feedback/details/574959/cannot-create-open-instance-delegate-for-value-types-methods-which-implement-an-interface?wa=wsignin1.0#details

Но даже пытаясь связатьдля таких членов, как Equals, GetHashCode или ToString, приводящих к ошибкам, например,

public struct A
{
     public override int GetHashCode(){/*implementation goes here*/}
}
delegate TRet FuncByRef<TStruct,TRet>(ref TStruct) where TStruct:struct

...

Delegate.CreateDelegate(typeof(FuncByRef<A,int>),typeof(A).GetMethod("GetHashCode"));

завершится с ошибкой «Ошибка привязки к цели»метод».

1 Ответ

0 голосов
/ 01 декабря 2010

Как насчет того, чтобы компилятор беспокоился об этом, то есть

public static string SomeHelper(A obj) {
    return obj.SomeMethod();
}

Затем связывайтесь с "SomeHelper".Это также может быть универсальный необходимый метод, где он будет использовать магический «ограниченный» код операции.

Это также похоже на

Func<A string> func = obj => obj.SomeMethod();

Если вы используете рефлексию, чтобы получить метод, вы можете попробовать DynamicMethod.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...