2013-01-04 48 views
0

讓我開始說,我不知道這個具體的需要自定義屬性,但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. 我怎樣才能得到這個(或類似)的功能。

回答

1

當您處於ToFormattedString()方法中時,無法檢索TestAttribute類或其屬性。另一種方法是傳遞方法一個額外的參數,這是一個表達式來獲取屬性。我聽說處理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));