gpt4 book ai didi

c# - 如何为 Activator.CreateInstance 选择 "right"构造函数

转载 作者:行者123 更新时间:2023-11-30 12:59:36 25 4
gpt4 key购买 nike

当使用 .NET 的 Activator.CreateInstance 方法时,我正在为其构造函数传递类型和参数。有些类型有几个这样的构造函数:

public foo(Status status, TServiceReference listService, 
Int32 listID, Int16 clientID)
{
Status = status;
ListService = listService;
ListID = listID;
ClientID = clientID;
}

public foo(Status status, String listServiceRegexCompare,
Int32 listID, Int16 clientID)
{
Status = status;
ListServiceRegexCompare = listServiceRegexCompare;
ListID = listID;
ClientID = clientID;
}

如果在运行时第二个参数是null,我总是希望选择第一个构造函数。有什么办法可以做到这一点? (请注意,我正在为几种不同的类型调用 Activator.CreateInstance,而对于另一种类型,构造函数当然可能期望不同类型的参数的另一个计数)。但同样,我总是想要不期望调用字符串的构造函数,并为该参数传递一个空对象。

谢谢。

编辑:

我是这样调用方法的

public void ActivateEvent(Object instance, EventInfo eventInfo, 
ILoggingSupport logger, params Object[] parameter)
{
Delegate handler =
Delegate.CreateDelegate(
eventInfo.EventHandlerType, this,
GetType().GetMethod("Handler"));

_instance = instance;
_eventInfo = eventInfo;
_handler = handler;
_logger = logger;

eventInfo.AddEventHandler(instance, handler);

Type eventArgsType =
eventInfo.EventHandlerType.GetGenericArguments()[0];

_referenceArgs =
Activator.CreateInstance(eventArgsType, parameter) as IComparable;
}

最佳答案

首先,从您初始化类的方式来看,您似乎有两个略有不同的类版本,您已将其合并为一个版本。即一个具有服务引用和一个具有正则表达式。如果是这种情况(服务引用和正则表达式是互斥的),您应该考虑将它们重写为两个具有公共(public)基类的独立类。如果你这样做,那么这个问题就会消失。

在您调用 CreateInstance 的代码中,您有一段非常通用的代码,尝试在一段通用代码中解决特定问题将很困难。代码不再通用。您可以做的是尝试在通话前解决它。例如,根据您需要支持的参数数量,有一些过载

public void ActivateEvent<T1,T2>(Object instance, EventInfo eventInfo, 
ILoggingSupport logger, T1 p1, T2 p2)
{
...
var parameterTypes = new []{typeof(T1), typeof(T2)};
var arguments = new object[]{p1,p2};
var ctor = eventArgsType.GetConstructor(parameterTypes);
_referenceArgs = ctor.Invoke(arguments) as IComparable;
}

这没有使用 Activator.CreateInstance,因为当您将空参数向上转换为对象时,所需的类型信息将被删除。

关于c# - 如何为 Activator.CreateInstance 选择 "right"构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24795841/

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