okudum aklıma geldi bir çözüm Bu, C# Attributes için yerleşik desteği kullanmaktı. Özellik, bir özelliği, alanı, yöntemi, sınıfı, vb. Başka bir sınıf tarafından daha sonra örneğin Serialization sırasında kullanılan bazı ek meta verileriyle etiketlemenin bir yoludur. En çok orada göreceksin.
IEnumerable
nesne koleksiyonunu kullanabilmem için gereken bir uygulama yaptım ve bazı verileri kullanıcı tarafından seçilen seçimlere göre bir dosyaya verdim. Bana seçenekleri yansıtma yoluyla okuma ve yönlendirme yapma yeteneği veren bir öznitelik sınıfı yarattım.Size örnek gösterelim:
Birinci nitelik sınıfı: şöyle tanımlanır Bu sınıf ile
[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;
}
}
, böyle benim veri sınıfı özelliklerini (kaybolmadığından olarak gerçek özellikleri bu yüzden değişti süslemeleri iş jargon):
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; }
}
benim ihracat rutininde Öyleyse
yerine sabit kodlama etrafında göstermek veya gizlemek için hangi alanların hakkında bilgi içeriyordu değişkendir özellik adları, ya da bir karmaşık veri yapısı geçirerek ve sipariş ne, ben sadece bu kodu yansıtma kullanarak, özellikleri döngülemek ve değerlerini çıktılamak için bu durumda bir CSV dosyasına yönlendirdim.
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 yapısı için kod buradadır:
struct OrderedProperties
{
/// <summary>
///
/// </summary>
public int OrderByValue;
/// <summary>
///
/// </summary>
public string PropertyName;
/// <summary>
///
/// </summary>
public string Header;
/// <summary>
///
/// </summary>
public bool Export;
}
Gördüğünüz gibi arsa değerlerini ayıklamak için mantık sınıfının yapısının tamamen cahil. Tek yaptığı, yarattığım öznitelikle dekore edilen özellikleri bulmak ve işlemi yürütmek için kullanmaktır.
Umarız bu her şey anlamlıdır, ve daha fazla yardıma veya açıklamaya ihtiyacınız varsa, lütfen sormaya çekinmeyin.
Yönetilen Genişletilebilirlik Çerçevesine (MEF) baktınız mı? http://mef.codeplex.com/ http://msdn.microsoft.com/en-us/library/dd460648.aspx – spender
Bunu duydum ve kullanımı hakkında kısa bir fikrim var. Mesele şu ki, programlamada yeniyim ve diğer dillere ve sistemlere kolayca taşınabilir bir çözüm uygulamak istiyorum. Ayrıca, bu karmaşık sistemleri gerçekten uygulamayı öğrenmek istiyorum. –
C# ile uygulamak, Linux ve diğer platformlarda çalışan .Net çerçevesinin bir portu olan Mono olduğu için diğer sistemlere taşınabilir hale getirir. Bunu diğer dillere hızlı bir şekilde ulaştıracak olsa da, bu kadar jenerik olmasından endişelenmem. Her dil ve platformun kendi deyim ve en iyi uygulamaları vardır ve bir birinde iyi çalışan bir şey, başka bir işe yaramayabilir. –