我正在使用Mono.Cecil自动生成(很多简单,通用的)工厂方法,从而为库提供方便的API。 为标记有特殊自定义属性的属性生成工厂。 要生成它们,我必须知道此类属性的类型。 非通用情况很简单:
ModuleDefinition module = /* obtained from ReadAssembly */
foreach (var type in module.Types)
if (/* type is marked with the right attribute */)
foreach (var prop in type.Properties)
if (/* prop is marked with the right attribute */)
GenerateFactory(type, prop, prop.PropertyType);
但是,标记的某些类型实际上是泛型。 在这种情况下,类型上的属性包含应为其创建工厂的通用参数,如下所示:
[EmitFactories(typeof(int))]
public class Class<T>
{
[MagicProperty]
T Property { get; set; }
}
(在这里,我希望为Class<int>.Property
工厂)。 我通过将type
为GenericInstanceType
处理这种情况。 但是,我无法获得属性的类型-枚举type.Properties
我需要首先调用Resolve()
,它会丢失所有通用信息。 然后,属性类型为T
(而不是int
),这当然会使后面的代码失败。
Mono.Cecil具有GenericInstanceType
和GenericInstanceMethod
,但是属性没有等效项。 我尝试使用module.Import(prop.PropertyType, type)
(将type
作为通用参数提供程序),但这是行不通的。
您对如何解决实际的物业类型有任何想法吗? 请注意,它可以与T
, T
本身完全无关,也可以将T
埋入内部(例如List<T>
)。 理想情况下,它可以在给定type
为TypeReference
情况下工作-这样,我就不必为非泛型和泛型情况编写单独的代码。