說來,當我讀心目中的解決方案這是爲了利用C#中的Attributes的內置支持。屬性是一種標記屬性,字段,方法,類等的方法,其中包含一些其他元數據,然後由其他類使用,例如在Serialization期間。你會經常在那裏看到它。
我有一個應用程序,我正在建設,需要能夠採取IEnumerable
對象集合,並輸出一些數據到文件基於用戶選擇的選擇。我創建了一個屬性類,使我能夠通過反射來閱讀選擇,並按照指示行事。讓我告訴你的例子:
首先是屬性類:
[System.AttributeUsage(AttributeTargets.Property)]
class ExportOptionsAttribute : System.Attribute
{
public string Header { get; set; }
public string FormatString { get; set; }
public bool Export { get; set; }
public int Order { get; set; }
/// <summary>
///
/// </summary>
/// <param name="header"></param>
public ExportOptionsAttribute(string header) : this (header, null, true)
{
}
/// <summary>
///
/// </summary>
/// <param name="header"></param>
/// <param name="formatString"></param>
/// <param name="export"></param>
public ExportOptionsAttribute(string header, string formatString, bool export)
{
this.Header = header;
this.FormatString = formatString;
this.Export = export;
this.Order = 0;
}
}
,象這樣定義這個類,我可以裝飾我這樣的數據類屬性(實際性改變,以便不會迷路上商業行話):
public sealed class PartsOrder
{
/// <summary>
///
/// </summary>
[ExportOptions("Customer Name", Order=0)]
public string CustomerName { get; set; }
/// <summary>
///
/// </summary>
[ExportOptions("Catalog Name", Order = 1)]
public string Catalog Name { get; set; }
/// <summary>
///
/// </summary>
[ExportOptions("Unit", Order = 2)]
public string Unit { get; set; }
/// <summary>
///
/// </summary>
[ExportOptions("Component", Order = 3)]
public string Component { get; set; }
/// <summary>
///
/// </summary>
[ExportOptions("Delivery Point", Order = 4)]
public string DeliveryPoint { get; set; }
/// <summary>
///
/// </summary>
[ExportOptions("Order Date", Order = 5)]
public string OrderDate { get; set; }
}
所以後來在我出口常規,而不是硬編碼的屬性名稱,它是可變的,或經過一個複雜的數據結構,在其周圍包含了哪些字段,以顯示或隱藏信息以及排序是什麼,我在這種情況下,只需運行以下代碼(使用反射)將屬性循環並將其值輸出到CSV文件。
StringBuilder outputDoc = new StringBuilder();
// loop through the headers in the attributes
// a struct which decomposes the information gleaned from the attributes
List<OrderedProperties> orderedProperties = new List<OrderedProperties>();
// get the properties for my object
PropertyInfo[] props =
(typeof(PartsOrder)).GetProperties();
// loop the properties
foreach (PropertyInfo prop in props)
{
// check for a custom attribute
if (prop.GetCustomAttributesData().Count() > 0)
{
foreach (object o in prop.GetCustomAttributes(false))
{
ExportOptionsAttribute exoa = o as ExportOptionsAttribute;
if (exoa != null)
{
orderedProperties.Add(new OrderedProperties() { OrderByValue = exoa.Order, PropertyName = prop.Name, Header = exoa.Header, Export = exoa.Export });
}
}
}
}
orderedProperties = orderedProperties.Where(op => op.Export == true).OrderBy(op => op.OrderByValue).ThenBy(op => op.PropertyName).ToList();
foreach (var a in orderedProperties)
{
outputDoc.AppendFormat("{0},", a.Header);
}
// remove the trailing commma and append a new line
outputDoc.Remove(outputDoc.Length - 1, 1);
outputDoc.AppendFormat("\n");
var PartsOrderType = typeof(PartsOrder);
//TODO: loop rows
foreach (PartsOrder price in this.Orders)
{
foreach (OrderedProperties op in orderedProperties)
{
// invokes the property on the object without knowing the name of the property
outputDoc.AppendFormat("{0},", PartsOrderType.InvokeMember(op.PropertyName, BindingFlags.GetProperty, null, price, null));
}
// remove the trailing comma and append a new line
outputDoc.Remove(outputDoc.Length - 1, 1);
outputDoc.AppendFormat("\n");
}
爲OrderedProperties結構的代碼是在這裏:
struct OrderedProperties
{
/// <summary>
///
/// </summary>
public int OrderByValue;
/// <summary>
///
/// </summary>
public string PropertyName;
/// <summary>
///
/// </summary>
public string Header;
/// <summary>
///
/// </summary>
public bool Export;
}
正如你可以看到,提取屬性值的邏輯是完全不知道的類的結構。它所做的就是查找用我創建的屬性裝飾的屬性,並使用它來驅動處理。
我希望這一切都有道理,如果您需要更多幫助或澄清,請隨時詢問。
你看過託管擴展性框架(MEF)嗎? http://mef.codeplex.com/ http://msdn.microsoft.com/en-us/library/dd460648.aspx – spender
我聽說過它,我對它的用法有個簡單的概念。問題是,我對編程不熟悉,我想實現一個易於移植到其他語言和系統的解決方案。另外,我想真正學會實施這些複雜的系統。 –
在C#中實現它使得它可以移植到其他系統,因爲有Mono,它是在Linux和其他平臺上運行的.Net框架的一個端口。我並不一定擔心它會變得如此通用,儘管它可以快速轉換到其他語言。每種語言和平臺都有自己的一套成語和最佳實踐,而在一種語言和平臺中運行良好的東西在另一種語言和平臺中可能效果不佳。 –