C# 实例化没有公共构造函数的.NET类

C# 实例化没有公共构造函数的.NET类,c#,.net,C#,.net,如何在没有公共构造函数(也没有静态工厂方法)的情况下实例化类。具体地说,我正试图将.NETElapsedEventArgs类与我的自定义计时器类一起使用,但无法创建它的新对象。如果您不能实例化它,System.Timers.Timer是如何实现的?创建类似类的首选方法是扩展EventArgs 如果您不能实例化它,System.Timers.Timer是如何实现的 ElapsedEventArgs有一个构造函数,但它是内部的,因此只有在同一程序集中声明的代码才能调用它。您可以在以下网站上看到: 内

如何在没有公共构造函数(也没有静态工厂方法)的情况下实例化类。具体地说,我正试图将.NET
ElapsedEventArgs
类与我的自定义计时器类一起使用,但无法创建它的新对象。如果您不能实例化它,
System.Timers.Timer
是如何实现的?创建类似类的首选方法是扩展
EventArgs

如果您不能实例化它,
System.Timers.Timer
是如何实现的

ElapsedEventArgs
有一个构造函数,但它是内部的,因此只有在同一程序集中声明的代码才能调用它。您可以在以下网站上看到:

内部ElapsedEventArgs(int-low,int-high){

长文件时间=(长)((ulong)高)可以使用反射访问非公共构造函数。您应该记住,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文件时结构的高低组件;它对用户不太友好,而且反射的性能非常差,因此,如果您有经常引发这些事件的场景,这可能是一个问题。反射有一个众所周知的(并且是公认的)缓慢的名声;只有当它是你唯一的选择时,才应该谨慎使用

我将使用一个简单的构造函数创建自己的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));

轻松轻松。

我从来都不知道将
sourceof.net
重定向到
referencesource.microsoft.com
,太棒了!谢谢@MarcinJuraszek有没有机会回答我的其他(有些相关)问题
raise_event(new MyElapsedEventArgs(new DateTime.Now));