实例化没有公共构造函数的.net类
本文关键字:net 构造函数 实例化 | 更新日期: 2023-09-27 18:05:31
如何实例化一个没有公共构造函数(也没有静态工厂方法)的类。具体来说,我试图使用。net ElapsedEventArgs
类与我的自定义定时器类,但创建它的新对象是不可能的。如果你不能实例化它System.Timers.Timer
怎么做呢?是首选的方式创建类似的类扩展EventArgs
?
如果你不能实例化它,
System.Timers.Timer
怎么做呢?
ElapsedEventArgs
有一个构造函数,但它是内部的,所以只有在同一程序集中声明的代码才能调用它。你可以在sourceof.net上看到:
internal ElapsedEventArgs(int low, int high) {
long fileTime = (long)((((ulong)high) << 32) | (((ulong)low) & 0xffffffff));
this.signalTime = DateTime.FromFileTime(fileTime);
}
创建扩展
EventArgs
的类似类的首选方法是?
可以使用反射访问非公共构造函数。您应该记住,Microsoft将类定义为内部类,因此可以自由地重新定义构造函数的签名,而不必担心破坏您的代码,但我认为使用ElapsedEventArgs几乎没有可能发生这种情况。
下面的示例演示了执行此操作的代码:using System;
using System.Reflection;
using System.Timers;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
var constructorInfo = typeof(ElapsedEventArgs).GetConstructor(
BindingFlags.NonPublic | BindingFlags.Instance,
null, new [] { typeof(int), typeof(int) }, null);
var elapsedEventArgs = (ElapsedEventArgs)
constructorInfo.Invoke(new object[] { 50, 50 });
}
}
}
这个类的构造函数签名很复杂,要求你提供DOS FILETIME结构的high和low组件;它不是很用户友好,反射有非常差的性能,所以如果你有一个场景,你经常提出这些事件,这可能是一个问题。反射速度慢是众所周知的(也是应得的)名声;只有在别无选择的情况下,才应谨慎使用。
我将用一个简单的构造函数创建我自己的EventArgs类,该构造函数具有DateTime格式的当前时间,如下面的示例所示:
using System;
using System.Timers;
public class MyElapsedEventArgs : EventArgs
{
public MyElapsedEventArgs(DateTime fireTime)
{
FireTime = fireTime;
}
public DateTime FireTime { get; private set; }
}
然后您将像这样引发事件:
raise_event(new MyElapsedEventArgs(new DateTime.Now));
容易breazy。