由于收集了<条码>Func<Letter>,称随机功能很方便。 但是,你如何根据集会的类型建立这些职能的收集?
对于这些类型的问题,我认为有必要写一份通用的助手职能,然后通过思考将其称作“;”
private static Func<Letter> GetDelegate<T>() where T : Letter, new()
=> () => new T();
var getDelegate = new Func<Func<Letter>>(GetDelegate<Letter>)
.Method
.GetGenericMethodDefinition();
factories = typeof(Letter).Assembly.GetTypes()
.Where(t => t != typeof(Letter)
&& !t.IsAbstract
&& t.IsAssignableTo(typeof(Letter)))
.Select(t => (Func<Letter>)getDelegate
.MakeGenericMethod(t)
.Invoke(null, null))
.ToArray();
虽然这种办法确实使用了反思,但成本是一次性的。 在一个静态领域储存收集工作,使用这些方法应当作为手工界定的收集工作效率。
If you need to pass a standard set of arguments to a constructor, I would lean on static abstract members
public interface ILetter<T> where T : ILetter<T>
{
static abstract T Factory(int argument);
}
private static Func<int, Letter> GetDelegate<T>() where T : Letter, ILetter<T>
=> (arg) => T.Factory(arg);