Ear*_*rlz 3 .net c# reflection delegates custom-attributes
我正在使用Attributes构建一些东西.我真的想要作为属性实现的一件事是convert a string to this property's type using this function.现在,我有这个:
public delegate object ParameterConverter(string val);
[AttributeUsage(AttributeTargets.Property)]
public class ParameterConverterAttribute : ParameterBaseAttribute
{
ParameterConverter Converter;
public ParameterConverterAttribute(ParameterConverter converter)
{
Converter=converter;
}
public object Convert(string val)
{
return Converter(val);
}
}
Run Code Online (Sandbox Code Playgroud)
我这样使用它:
public class Tester
{
[ParameterConverter(new ParameterConverter(TestConverter)] //error here
public int Foo{get;set;}
static object TestConverter(string val)
{
return 10;
}
}
Run Code Online (Sandbox Code Playgroud)
但是,.Net或至少C#似乎不支持这种事情.似乎属性内的委托不起作用.
是否有解决此问题的方法或处理此问题的好方法?
No Delegates不能作为参数传递给Attribute.支持的类型是:
但是由于它支持Type和string,您可以传递Type和方法的名称以在Attribute类中创建委托.
public delegate object ParameterConverter(string val);
[AttributeUsage(AttributeTargets.Property)]
public class ParameterConverterAttribute : ParameterBaseAttribute
{
public ParameterConverter Converter { get; set; }
public ParameterConverterAttribute(Type delegateType, string method)
{
try{ // Important as GetMethod can throw error exception or return null
this.Converter = (ParameterConverter)Delegate.CreateDelegate(delegateType, delegateType.GetMethod(method));
}
catch { }
}
public object Convert(string val)
{
if(this.Converter != null)
return Converter(val);
}
}
Run Code Online (Sandbox Code Playgroud)
现在你可以使用它:
public class Tester
{
[ParameterConverter(typeof(ParameterConverter), "TestConverter"]
public int Foo{get;set;}
static object TestConverter(string val)
{
return 10;
}
}
Run Code Online (Sandbox Code Playgroud)
我希望这会对你有所帮助.