在C#属性中委派

时间:2014-11-04 18:09:31

标签: c# mono activator

我希望在自定义属性中放置一个静态委托。我遇到的是Activator.CreateInstance是一个主要的瓶颈,我想避免它。我正在使用Mono并在iOS上运行,因此编译的lambda和任何JIT' d方法都是不可能的。我希望做的是在每个具有该属性的类上放置一个静态工厂构造函数。所以它会是这样的:

[CustomAtt("cool",FactoryMethod)]
public class SomeClass{
    public static SomeClass FactoryMethod(){
        return new SomeClass()
    }
}

这给了我一个编译错误An Attribute must be a constant expression, typeof expression or array creation expression

我要将其粘贴在属性中的原因是我将要创建的所有对象都已具有该属性,并且在需要创建对象时我具有该属性。

是否有另一种方法可以实现这一目标,或者是另一种更快速的方法来创建对象。

2 个答案:

答案 0 :(得分:1)

听起来像你想要Delegate.CreateDelegate。指定方法名称和类型,使用反射(一次)查找方法,然后从中创建委托。你可以在属性构造函数中做到这一点,尽管我通常在属性类型中做的很少。另一种选择是使任何消耗属性的工作和缓存委托。

虽然这需要反思并能够动态创建委托,但我希望在iOS上的Mono中支持这两者(我认为你的意思是Xamarin.iOS,除非你正在推动你的自己的解决方案)。

答案 1 :(得分:0)

你的属性中最终会有String,正如乔恩在答案中所说的那样(所以,如果你要按照这条路线行事,可以归功于他)。

但是,如果您能够使用反射按名称调用方法,则还可以为给定类型调用构造函数(如ConstructorInfo,而不使用Activator.CreateInstance)。然后你不需要任何指向工厂方法的自定义属性;构造函数工厂方法。我建议考虑这个替代方案。