1

首先让我说我不知道​​这特别需要自定义属性,但DisplayFormatAttribute最接近我正在寻找的意图。


我想要什么

我希望能够为类的属性指定字符串格式,如下所示:

public class TestAttribute
{
    [CustomDisplayFormatAttribute(DataFormatString = "{0}")]
    public int MyInt { get; set; }

    [CustomDisplayFormatAttribute(DataFormatString = "{0:0.000}")]
    public float MyFloat { get; set; }

    [CustomDisplayFormatAttribute(DataFormatString = "{0:0.0}")]
    public float MyFloat2 { get; set; }

    [CustomDisplayFormatAttribute(DataFormatString = "{0:dd/MM/yyyy}")]
    public DateTime MyDateTime { get; set; }
}

...并且能够像这样使用它:

TestAttribute t = new TestAttribute()
        {
            MyDateTime = DateTime.Now,
            MyFloat = 1.2345678f,
            MyFloat2 = 1.2345678f,
            MyInt = 5
        };
Console.WriteLine(t.MyDateTime.ToFormattedString());
Console.WriteLine(t.MyFloat.ToFormattedString());
Console.WriteLine(t.MyFloat2.ToFormattedString());
Console.WriteLine(t.MyInt.ToFormattedString());


到目前为止我做了什么

我已成功创建自定义属性CustomDisplayFormatAttribute并将其应用于我的元素,但是在不了解我的TestAttribute类的情况下我无法获取该属性。

我的第一个想法是使用扩展方法来处理它,因此是ToFormattedString()函数。

话虽如此,理想情况下我将能够调用类似的函数ToFormattedString()并让它处理查找显示格式并将值应用于它。


我的问题

  1. 这可能使用 C#
  2. 我怎样才能获得这个(或类似的)功能。
4

1 回答 1

2

当您在方法中时,无法检索TestAttribute类或其属性。ToFormattedString()另一种方法是向该方法传递一个额外的参数,该参数是获取属性的表达式。我听说处理 Linq 表达式很昂贵,您需要测试您的情况是否属实:

public interface IHaveCustomDisplayFormatProperties
{
}

public class TestAttribute : IHaveCustomDisplayFormatProperties
{
    [CustomDisplayFormatAttribute(DataFormatString = "{0}")]
    public int MyInt { get; set; }

    [CustomDisplayFormatAttribute(DataFormatString = "{0:0.000}")]
    public float MyFloat { get; set; }

    [CustomDisplayFormatAttribute(DataFormatString = "{0:0.0}")]
    public float MyFloat2 { get; set; }

    [CustomDisplayFormatAttribute(DataFormatString = "{0:dd/MM/yyyy}")]
    public DateTime MyDateTime { get; set; }
}

public static class IHaveCustomDisplayFormatPropertiesExtensions
{
    public static string FormatProperty<T, U>(this T me, Expression<Func<T, U>> property)
        where T : IHaveCustomDisplayFormatProperties
    {
        return null; //TODO: implement
    }
}

可以这样使用:

TestAttribute t = new TestAttribute()
{
    MyDateTime = DateTime.Now,
    MyFloat = 1.2345678f,
    MyFloat2 = 1.2345678f,
    MyInt = 5
};
Console.WriteLine(t.FormatProperty(x => x.MyDateTime));
Console.WriteLine(t.FormatProperty(x => x.MyFloat));
Console.WriteLine(t.FormatProperty(x => x.MyFloat2));
Console.WriteLine(t.FormatProperty(x => x.MyInt));
于 2013-01-04T21:35:29.090 回答