C# 在单个字段中存储和调用不同类型的动作对象

C# 在单个字段中存储和调用不同类型的动作对象,c#,delegates,C#,Delegates,我有多种行动代表。例如: Action<float> floatAction; Action<string> stringAction; 我找不到Action类的基类型,所以我不知道这在某种程度上是否可行 Gr.Viller您可以使用作为所有委托类型基类的类 例如: Action<float> floatAction = (x) => Console.Write(x * 5); Action<string> stringAction = C

我有多种行动代表。例如:

Action<float> floatAction;
Action<string> stringAction;
我找不到Action类的基类型,所以我不知道这在某种程度上是否可行

Gr.Viller

您可以使用作为所有委托类型基类的类

例如:

Action<float> floatAction = (x) => Console.Write(x * 5);
Action<string> stringAction = Console.WriteLine;

Delegate d1 = floatAction;
d1.DynamicInvoke(4.3f);

d1 = stringAction;
d1.DynamicInvoke("Hello world");
Action-floatAction=(x)=>Console.Write(x*5);
Action stringAction=Console.WriteLine;
委托d1=浮动操作;
d1.动力Voke(4.3f);
d1=连续作用;
d1.DynamicInvoke(“你好世界”);

如果您创建引用您的
动作的新lambda,则可以使用
动作
(或
动作
和强制转换):

Action-floatAction=x=>Console.WriteLine(x*3);
Action stringAction=Console.WriteLine;
动作dyn=o=>floatAction(o);
dyn(1.5f);
dyn=o=>stringAction(o);
戴恩(“你好,世界!”);

我想说Selman22的解决方案可能更好,但我提出这个,以防它对您更有用。

这正是我想要的,谢谢!Delegate.DynamicInvoke而不是Action.Invoke是否有任何警告?Invoke可能是它不存在的原因。@Villeman最接近的方法是
DynamicInvoke
。您可以使用
d1.Method.invoke调用invoke,但是您需要提供额外的参数。我认为原因是编译器没有关于此委托所包含内容的信息,因此它不能仅推断类型。因此,在使用
DynamicInvoke
时,您还应该小心,必须提供正确的参数,否则,您不会得到任何编译时错误,但在运行时它将抛出异常。因此,如果我对实际上是操作的委托调用DynamicInvoke,它是否会提供参数(某物)?是的,它将传递参数,但它使用了延迟边界,这意味着它在运行时之前不会执行,并且在编译时不会检查它是否有效,例如在
Delegate d1=floatAction之后
如果调用dynamic invoke并传递字符串:
d1.DynamicInvoke(“Hello world”)
您将在运行时而不是编译时得到一个异常。好的,那么这对我来说非常有用,再次感谢=)
Action<float> floatAction = (x) => Console.Write(x * 5);
Action<string> stringAction = Console.WriteLine;

Delegate d1 = floatAction;
d1.DynamicInvoke(4.3f);

d1 = stringAction;
d1.DynamicInvoke("Hello world");
Action<float> floatAction = x => Console.WriteLine(x*3);
Action<string> stringAction = Console.WriteLine;

Action<dynamic> dyn = o => floatAction(o);
dyn(1.5f);
dyn = o => stringAction(o);
dyn("Hello World!");