C# 如果委托是非静态的,如何将委托传递给方法?
我刚刚开始理解委托,我有一个实现IDisposable的类:C# 如果委托是非静态的,如何将委托传递给方法?,c#,delegates,instance,idisposable,using,C#,Delegates,Instance,Idisposable,Using,我刚刚开始理解委托,我有一个实现IDisposable的类: public class MyClass : IDisposable { public delegate int DoSomething(); public int Zero() {return 0;} public int One() {return 1;} public void Dispose() { // Cleanup } } 使用MyClass的方法(在另一个类中定义): public
public class MyClass : IDisposable
{
public delegate int DoSomething();
public int Zero() {return 0;}
public int One() {return 1;}
public void Dispose()
{
// Cleanup
}
}
使用MyClass的方法(在另一个类中定义):
public class AnotherCLass
{
public static void UseMyClass(MyClass.DoSomething func)
{
using (var mc = new MyClass())
{
// Call the delegate function
mc.func(); // <-------- this is what i should actually call
}
}
}
因为它是一个实例方法,如果你想调用它,你需要一个实例。这就是CLR的工作原理。但是,您可以选择两种方式:
- 将成员函数设置为静态。如果它们只返回一个静态值那么简单,那么它们就没有理由成为实例方法。但是,如果您确实需要实例数据
- 使用单例实例。这样,您就不需要每次调用静态方法时都创建一个新实例
public class MyClass
{
private static MyClass singletonInstance;
public static MyClass SingletonInstance
{
get
{
if (singletonInstance == null)
{
singletonInstance = new MyClass();
}
return singletonInstance;
}
}
// the rest of your class implementation
}
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(MyClass.SingletonInstance.Zero);
没有实例化就无法完成。以下是你可以做到的:
public static void main(string[] args)
{
// Call AnotherClass method, by passing Zero()
// or One() but without instatiate MyCLass
AnotherClass.UseMyClass((new MyClass()).Zero);
}
您是否希望实例由委托的调用方而不是委托的创建者提供?C#确实支持这样一个未绑定的委托,它被称为开放委托,实例成为一个参数 您必须使用创建一个开放委托,如下所示:
public class MyClass
{
private static MyClass singletonInstance;
public static MyClass SingletonInstance
{
get
{
if (singletonInstance == null)
{
singletonInstance = new MyClass();
}
return singletonInstance;
}
}
// the rest of your class implementation
}
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")
)
);
也许如果你能解释一下你想做什么,我们可以推荐一些更好的。MyClass是DAL,我有一些成员方法要调用。另一个类(业务)使用DAL并定义“UseMyClass”方法。如何从GUI中传递零()函数到业务类,而不创建MyClass的新实例?您可以考虑使用MyC类对象上的接口来公开零()属性,然后让您的UsMyCype函数以该接口作为参数。嗯,对我来说似乎是个更好的方法。不,我不会。我不喜欢等级制度的爆炸。。。看到我的编辑了吗?我搞糊涂了。如果函数
Zero()?如果您想在没有MyClass
实例的情况下调用它,为什么不将其设置为static
?不,应该是mc.func(),而不是像您编写的那样。Gremo:C#不支持按您的需要执行mc.func()
。func(mc)
语法正确。