Являетесь ли вы намерением, чтобы экземпляр был предоставлен вызывающим лицом делегата, а не его создателем?C # поддерживает такой несвязанный делегат, он называется открытый делегат , и экземпляр становится параметром.
Вы должны использовать Delegate.CreateDelegate
для создания открытогоделегат, что-то вроде этого:
public class MyClass : IDisposable
{
public delegate int DoSomething();
public int Zero() {return 0;}
public int One() {return 1;}
public void Dispose()
{
// Cleanup
}
}
public class AnotherCLass
{
public static void UseMyClass(Converter<MyClass,int> func)
{
using (var mc = new MyClass())
{
// Call the delegate function
func(mc);
}
}
}
AnotherClass.UseMyClass(
(Converter<MyClass, int>)Delegate.CreateDelegate(
typeof(Converter<MyClass, int>),
typeof(MyClass).GetMethod("One")
)
);
Конечно, вы можете сделать это намного проще с помощью прокладки:
AnotherClass.UseMyClass( mc => mc.One() ); // C# 3 or later
AnotherClass.UseMyClass( delegate(MyClass mc) { return mc.One(); } ); // C# 2