在类中使用自定义属性迭代属性

时间:2017-09-21 20:41:04

标签: c# linq attributes iteration

我有一个这样的类,有一些自定义属性。我不确定我是否真的必须实现这些。

    [AttributeUsage(AttributeTargets.Field)]
    private class IsValue : Attribute { }
    [AttributeUsage(AttributeTargets.Field)]
    private class IsRep : Attribute { }
    [AttributeUsage(AttributeTargets.Class)]
    private class IsConstant : Attribute { }
    public static class Constants
    {
        [IsConstant]
        public static class EulerGamma
        {
            [IsValue]
            public const double Value = 0.5772156649015;
            [IsRep]
            public const string Str = "γ";
        }
        [IsConstant]
        public static class EulerNumber
        {
            [IsValue]
            public const double Value = 2.718281828459;
            [IsRep]
            public const string Str = "e";
        }
        [IsConstant]
        public static class Pi
        {
            [IsValue]
            public const double Value = 3.1415926535898;
            [IsRep]
            public const string Str = "π";
        }
        [IsConstant]
        public static class GoldenRatio
        {
            [IsValue]
            public const double Value = 1.6180339887499;
            [IsRep]
            public const string Str = "φ";
        }
    }

假设这是在某个类“MyMathClass”中,我想在其中实现这样的方法: string ValueOrString(double x) 如果传递的数字等于常量,则此方法将返回常量的字符串表示,否则它将返回原始数字。 所以,如果我完全通过3.1415926535898这个方法会给我字符串“π”。 如果传递例如2.5315621321,这将返回“2.5315621321”(字符串)。 你能帮帮我吗?

1 个答案:

答案 0 :(得分:1)

我会创建一个使用字典的类:

public static class Constants
{
    static Dictionary<double, string> constantNames;

    static Constants()
    {
        Constants.constantNames = new Dictionary<double, string>();

        Constants.constantNames.Add(3.1415926535898, "π");
        Constants.constantNames.Add(2.718281828459, "e");
    }

    public static string ValueOrString(double value)
    {
        if (constantNames.ContainsKey(value))
        {
            return constantNames[value];
        }
        else
        {
            return value.ToString();
        }
    }
}

调用函数string ValueOrString(double value)时,可以检查字典中是否存在提供的值。如果存在,则从中检索常量的名称。否则,将值作为字符串返回。