允许可选的构造函数参数为`T`方法?

时间:2018-02-16 00:41:15

标签: c# .net

我有这个方法创建一个类的实例,测量加载类所花费的时间,并且可以选择调用方法。我目前正在尝试实现将参数传递给此方法的构造函数的选项(IE T),但我有点卡住了,有人可以帮忙吗?

public static T CreateInstanceOf<T>(Action<T> configure = null) where T : new()
{
    var stopwatch = Stopwatch.StartNew();

    var result = new T();

    configure?.Invoke(result);

    stopwatch.Stop();

    Logger.Trace("Loaded " + result.GetType().Name + " [took " + stopwatch.ElapsedMilliseconds + "ms]");

    return result;
}

2 个答案:

答案 0 :(得分:1)

如果您继续使用此方法创建类实例的工作会更容易,因为目的不是创建对象 - 您只想为构造函数计时。你可以这样编写你的方法:

description: System Memory
physical id: 1000
size: 1GiB
capacity: 1GiB

(由于您只是计时,您是否需要此方法来返回已创建的public T TimeCreationOf<T>(Func<T> creator, Action<T> configure = null) { var stopwatch = Stopwatch.StartNew(); var result = creator.Invoke(); configure?.Invoke(result); stopwatch.Stop(); Logger.Trace("Loaded " + result.GetType().Name + " [took " + stopwatch.ElapsedMilliseconds + "ms]"); return result; } 实例?)

现在传入此方法的是一个返回T的函数。因为你想要的时间是构造函数,你可以传入一个调用构造函数的函数并返回T的实例。

这使得它变得更加容易,因为您不需要T约束 - new()可以是任何类型的构造函数。而且你不必担心&#34;计时&#34;方法将调用构造函数 - 您传入的函数为您执行此操作:

T

因为您直接调用构造函数,所以您确切地知道要调用哪个构造函数以及传递给它的内容。如果你试图编写一个可以创建各种对象的泛型方法,那将非常困难。

如果您仍然需要传入另一个TimeCreationOf(() => new ClassOne()); TimeCreationOf(() => new ClassTwo(5, "X")); 对该对象执行一些额外配置(并且您希望在时间中包含该配置),那么您也可以这样做。

Action<T>

答案 1 :(得分:0)

T不是一个方法 - 它是一个泛型类型,你需要一个无参数构造函数,你正在调用它。由于没有语法来指定类型实现特定的构造函数签名,因此您有两个选项:

  1. 使用反射(例如Activator.CreateInstance)将参数传递给构造函数,希望,无论T 在运行时支持这些参数,或者
  2. 要求T实现一些可用于初始化对象的界面:

    public interface IInitializable
    {
        public void Init(...parameters...)
    }
    public static T CreateInstanceOf<T>(Action<T> configure = null) where T : new(), IInitializable
    {
          T = new T();
          T.Initialize(...parameters...);
          ...
    }