C# 如何在NET assembly中自动初始化任何类

C# 如何在NET assembly中自动初始化任何类,c#,.net,reflection,attributes,C#,.net,Reflection,Attributes,首先让我说,我想的是创建属性,并使用该属性自动创建用该属性装饰的类的实例。在我的情况下,类的实现是非常复杂的,我不想在这里使用IoC容器,因为首先我认为它们在被请求之前不会被创建,其次这只适用于需要自动实例化的特殊类集,这些类主要是服务类。下面是用于创建singleton的代码的实现 public abstract class Singleton<T> where T : class { private readonly IEventAggregator _eventAggr

首先让我说,我想的是创建属性,并使用该属性自动创建用该属性装饰的类的实例。在我的情况下,类的实现是非常复杂的,我不想在这里使用IoC容器,因为首先我认为它们在被请求之前不会被创建,其次这只适用于需要自动实例化的特殊类集,这些类主要是服务类。下面是用于创建singleton的代码的实现

public abstract class Singleton<T> where T : class
{
    private readonly IEventAggregator _eventAggregator = 
        ServiceLocator.Current.GetInstance<IEventAggregator>();

    private static readonly Lazy<T> Instance
        = new Lazy<T>(() =>
                          {
                              ConstructorInfo[] ctors = typeof(T).GetConstructors(
                                  BindingFlags.Instance
                                  | BindingFlags.NonPublic
                                  | BindingFlags.Public);
                              if (ctors.Count() != 1)
                                  throw new InvalidOperationException(
                                      String.Format("Type {0} must have exactly one constructor.", typeof(T)));
                              ConstructorInfo ctor =
                                  ctors.SingleOrDefault(c => !c.GetParameters().Any() && c.IsPrivate);
                              if (ctor == null)
                                  throw new InvalidOperationException(
                                      String.Format(
                                          "The constructor for {0} must be private and take no parameters.",
                                          typeof(T)));
                              return (T)ctor.Invoke(null);
                          });

    public static T Current
    {
        get { return Instance.Value; }
    }
}
public class PersonService : Singleton<PersonService>, IPersonService
{
    private PersonService()
    {
        RegisterForEvent<PersonRequest>(OnPersonRequered);
        //_serviceClient = ServiceLocator.Current.GetInstance<ICuratioCMSServiceClient>();
    }
}

我在Stackoverflow上发现了这段代码,我认为这非常有趣,但并没有成功初始化类。

在引用某个类之前,您可以使用静态构造函数为该类运行代码。以下是微软提供的一些信息:


编辑:这可能会回答你的问题。它还有代码示例。

在请求时实例化的类有什么问题?从长远来看,单例的广泛使用会对您造成不利影响,因为这些是每个模块的唯一服务类,所以这不是用于哪种用途,此类类的数量将是最少的。这里的问题是firtordefualt方法的Where close,它的条件不返回任何运行时助手。RunClassConstructorWow听起来很酷,唯一的问题是它使用了tuntimehandler类型的参数,这是我第一次看到OK,我想我找到了方法,但这使我的代码发生了变化RuntimeHelpers.RunClassConstructor(type.TypeHandle);是的,但您必须创建该类型的实例才能第一次激活静态构造函数,因为MSDN声明静态构造函数在创建任何实例之前只声明一次,但这并不意味着它将在不引用实例的情况下自行执行静态构造函数始终执行,所以有一个很好的钩子来启动你的singletonsCan你看看代码并提供示例实例吗?我在创建单例类时并没有问题,但只会自动初始化它们,并且我测试了静态构造函数,在执行过程中,静态构造函数中并没有遇到制动点。
public class InitOnLoad : Attribute
{
    public static void Initialise()
    {
        // get a list of types which are marked with the InitOnLoad attribute
        var types =
            from t in AppDomain.CurrentDomain.GetAssemblies().SelectMany(a => a.GetTypes())
            where t.GetCustomAttributes(typeof(InitOnLoad), false).Any()
            select t;

        // process each type to force initialize it
        foreach (var type in types)
        {
            // try to find a static field which is of the same type as the declaring class
            var field =
                type.GetFields(System.Reflection.BindingFlags.Static
                               | System.Reflection.BindingFlags.Public
                               | System.Reflection.BindingFlags.NonPublic
                               | System.Reflection.BindingFlags.Instance).FirstOrDefault(f => f.FieldType == type);
            // evaluate the static field if found
            //if (field != null) field.GetValue(null);
        }
    }
}