Kein Weg. Sie möchten zwei Dinge, die derzeit Attribute in C# nicht unterstützt:
Generische Typ Parameter.
Nicht konstante Argumente.
Denken Sie, dass Attribute nur Metadaten sind, Sie können nicht erwarten, während ihrer Verwendung nichts auszuführen (offensichtlich kann der Attributkonstruktor den Code ausführen, den Sie ihm hinzufügen).
Während die anderen Q & A Sie verknüpft haben erwähnt, dass IL emittierende direkt sollten Sie in der Lage sein, es zu tun, ich bin auch ziemlich sicher, dass Sie eine fließend API vermeiden können, die Komplexität zu Ihrem Projekt hinzufügen Umsetzung:
public class A : IMappingConfigurator
{
public string Name { get; set; }
public void Configure(IMappingConfiguration config)
{
config.Map<Foo>(foo => foo.Name);
}
}
und während der Konfigurationsphase können Sie alle Arten der Umsetzung der gesamten Schnittstelle erhalten und instanziiert sie nur, um die Konfiguration eines jeden:
IEnumerable<IMappingConfigurator> configurators = Assembly.GetExecutingAssembly().GetTypes().Where
(
t => t.GetInterfaces().Any(t => t == typeof(IMappingConfigurator))
).Select(t => (IMappingConfigurator)Activator.CreateInstance(t));