我有这个方法创建一个类的实例,测量加载类所花费的时间,并且可以选择调用方法。我目前正在尝试实现将参数传递给此方法的构造函数的选项(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;
}
答案 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
不是一个方法 - 它是一个泛型类型,你需要一个无参数构造函数,你正在调用它。由于没有语法来指定类型实现特定的构造函数签名,因此您有两个选项:
Activator.CreateInstance
)将参数传递给构造函数,希望,无论T
在运行时支持这些参数,或者要求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...);
...
}