实例化没有公共构造函数的.net类

本文关键字:net 构造函数 实例化 | 更新日期: 2023-09-27 18:05:31

如何实例化一个没有公共构造函数(也没有静态工厂方法)的类。具体来说,我试图使用。net ElapsedEventArgs类与我的自定义定时器类,但创建它的新对象是不可能的。如果你不能实例化它System.Timers.Timer怎么做呢?是首选的方式创建类似的类扩展EventArgs ?

实例化没有公共构造函数的.net类

如果你不能实例化它,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。