gpt4 book ai didi

c# - InvokeMethod 可以用作可选参数吗?

转载 作者:行者123 更新时间:2023-11-30 20:47:19 24 4
gpt4 key购买 nike

我在项目中有基类A

A继承了很多子类

public class A
{
public void Process(string myString1, int myInt1 )
{
Type type = this.GetType();
type.InvokeMember("ImAChildMethod", System.Reflection.BindingFlags.InvokeMethod
| System.Reflection.BindingFlags.NonPublic
| System.Reflection.BindingFlags.Instance,
null,
this,
new object[] { myString1, myInt1 });
}
}

子类:

public class B:A
{
private void ImAChildMethod(string myString, int myInt )
{
Console.WriteLine (myInt + ","+myString);
}
}

所以当我执行时:

new B().Process("aaa",15); 我明白了

15,aaa

很好

几天过去了,现在我们需要发送——而不是:

新对象[] { myString1, myInt1 }

但是

新对象[] { myString1, myInt1 , MyDateTime }

(然而,并不是所有的子类都使用这个日期时间参数)

好的,所以我们(在特定的地方)改变了:

 private void ImAChildMethod(string myString, int myInt )

 private void ImAChildMethod(string myString, int myInt ,DateTime myDateTime )

那么问题出在哪里呢?

它在我们没有改变的地方引起了异常。

问题

我不想遍历所有子类并添加 datetime 的这个参数。 (不是所有的子类都使用这个参数)

有没有办法“预先识别”ImAChildMethod 有/没有 ,DateTime myDateTime 如果有:使用它,如果没有'-忽略新参数?

我很确定我必须遍历子类并添加可选参数……但我可能错了?

最佳答案

可选参数实际上是一个编译时特性 - CLR 和框架与它们关系不大,除了通过反射使信息可用

因此,虽然您可以检测到参数是可选的(使用 ParameterInfo.IsOptional )并获得默认值(使用 ParameterInfo.DefaultValue )这一事实,但您需要明确地执行此操作 - InvokeMember 不会为你做。

您可能想要编写一个类似于 InvokeMember 的辅助方法,但处理可选参数...请记住,如果您只接受一个名称,您将陷入重载解析的尴尬境地。为了简单起见,您可能希望将其限制为仅使用具有单个重载的名称。

关于c# - InvokeMethod 可以用作可选参数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25890229/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com