Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何实施";使用此函数进行转换;Net中的自定义属性?_C#_.net_Reflection_Delegates_Custom Attributes - Fatal编程技术网

C# 如何实施";使用此函数进行转换;Net中的自定义属性?

C# 如何实施";使用此函数进行转换;Net中的自定义属性?,c#,.net,reflection,delegates,custom-attributes,C#,.net,Reflection,Delegates,Custom Attributes,我正在使用属性构建一些东西。我真正想实现的一个属性是使用此函数将字符串转换为该属性的类型。现在,我有这个: public delegate object ParameterConverter(string val); [AttributeUsage(AttributeTargets.Property)] public class ParameterConverterAttribute : ParameterBaseAttribute { Para

我正在使用属性构建一些东西。我真正想实现的一个属性是使用此函数将字符串转换为该属性的类型。现在,我有这个:

    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);
        }
    }
我是这样使用它的:

public class Tester
{
    [ParameterConverter(new ParameterConverter(TestConverter)] //error here
    public int Foo{get;set;}
    static object TestConverter(string val)
    {
      return 10;
    }
}
然而,.Net或者至少是C#似乎不支持这种东西。属性中的代理似乎不起作用

是否有解决此问题的方法或处理此问题的好方法?

查找

此示例演示如何创建名为AuthorConverter的类型转换器…AuthorConverter示例将Author对象转换为字符串,将字符串表示形式转换为Author对象


更新: 您可以跳过@abhishek等属性的限制

另一种可能的方法是定义一些“配置上的约定”:转换器函数是这样定义的方法 在同一类中定义的专用静态转换器(字符串val)。就你而言:

public class Tester
{
    public int Foo{get;set;}
    private static int FooConverter(string val)
    {
      return 10;
    }
}

您可以将一些ParameterConverterAttribute放在属性的顶部,作为自定义转换器函数存在但不是必需的标志

不能将委托作为参数传递给属性。支持的类型包括:

  • 反对
  • 类型
  • 枚举
  • 一维阵列
  • bool、byte、float char、double、int、long、string。。。。等等
  • 但由于它支持类型和字符串,因此可以传递类型和方法名称,以便在属性类内创建委托

    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);
        }
    }
    
    现在你可以像这样使用它:

    public class Tester
    {
        [ParameterConverter(typeof(ParameterConverter), "TestConverter"] 
        public int Foo{get;set;}
        static object TestConverter(string val)
        {
          return 10;
        }
    }
    

    我希望这对你有帮助

    那不行。。默认情况下,我使用
    Convert.ToType
    ,但如果用户愿意,我想允许他们以自定义方式转换内容(特别是对于非内置类型的内容),我怀疑人们正在进行向下投票,因为这无法解决手上的问题(如我所说)取消了我对编辑的向下投票。这可能行得通,但我讨厌那种“神奇”的东西。我想我更希望有一个单独的转换器类,带有一个自定义接口,比如
    IParamConverter
    或其他什么,并使用
    ParameterConverter(typeof(MyConverterClass))]
    您是否在寻找一个通用的处理程序,用于在给定特定解析器的情况下将字符串反序列化为任意格式?或者只是设置现有对象的属性?或者除了字符串之外的其他输入类型?好吧,这似乎是答案,不管我喜欢与否:(