Kullanıcının bir dizi KPI, çizelge, toplama fonksiyonu ve diğer parametreler arasından seçim yapabileceği basit bir raporlama aracı oluşturmaya çalışıyorum; Daha sonra tüm verilerle özel bir model döndüren çağrılır. Bu daha sonra bir MVC/WPF uygulamasında görüntülenebilir (her ikisi de olabilir).Yarı reklam raporu için genel arayüzler
Kullanıcılar çeşitli ülkelerden olabileceğinden, mevcut numaraların kullandığı dile ve sayı biçimlerine uygun bir şekilde tüm sayı ve üstbilgileri portre yapmak için veri ek açıklamalarını kullanmak istiyorum.
Verilerin yüklenmesi ve tüm bu şeyler gayet iyi çalışıyor, sorun değil. Ayrıca, veri ek açıklamaları kullanıyorum, bu yüzden tüm dil/kültüre özgü ayarlar dikkate alınır. Sorun, tüm verileri kullanıcıya göstermek istediğim modele koymaya başladığımda başlar.
Yapmaya çalıştığım bir sütun koleksiyonu içeren bir Rapor sınıfına sahip olmak. Her sütun, int/double/... değerlerinin bir listesi olabilir. Şimdi, WCF ile uğraştığım ve yukarıdaki açıklamanın (bildiğim kadarıyla) jeneriklerin kullanımı anlamına geldiğinden, sınıfları/wcf işlemleri için [KnownType] veya [ServiceKnownType] yöntemlerini kullanabileceğimi düşünüyorum. baz tipi veya dönüş değeri olarak arabirim. Bunu gerçekten denemedim, ama bana oldukça mantıklı görünen bazı iyi açıklamalar buldum, bu yüzden bu kısım için büyük bir sorunum olmayacağını düşünüyorum (en azından umarım).
Şu anda, benim arayüzleri gibidir böyle (Ben gerçek bir sorun odaklanmak basitleştirilmiş):
public interface IReport<T> where T: IConvertible { ICollection<IColumn<T>> Columns { get; set; } }
public interface IColumn<T> where T: IConvertible { ICollection<IValue<T>> Values { get; set; } }
public interface IValue<T> where T: IConvertible { T Value { get; set; } }
her sütundaki değer bir int/çift/... sanırım olabilir beri garip görünüyor
tabiipublic class IntValue: IValue<int>
{
[DisplayFormat(DataFormatString = "{0:#,##0;-#,##0;'---'}", ApplyFormatInEditMode = true)]
public int Value { get; set; }
}
, ne zamandan beri tekini: Ben gibi (ben bir koleksiyon türüne veri açıklama özelliğini kullanabilirsiniz sanmıyorum) sadece değer için gerçek bir sınıf olması gerekir IValue'yi uygulayan ve onunla yapılabilecek genel bir sınıf değeri yapın, ama eğer aptalca bir şey yaparsam ve Her olası tip için bir sınıf hazırlayın (şimdi yazdığımda, kulağa gerçekten kötü geliyor, biliyorum), DisplayFormat özniteliğini kullanabilirim ve kullanıcıya sunacağı şekilde endişelenmenize gerek yok. Her zaman uygun olurum. Şimdi
, IColumn ve İReport uygulamak sınıflar için, bu basit:
public class Report<T>: IReport<T> where T: IConvertible
{
public ICollection<IColumn<T>> Columns { get; set; }
public Report() { Columns=new List<IColumn<T>>(); }
}
public class Column<T>: IColumn<T> where T: IConvertible
{
public ICollection<IValue<T>> Values { get; set; }
public Column() { Values = new List<IValue<T>>(); }
}
arayüzleri ve sınıfların listesinden, hemen bu imkansız bir rapor bulundurmak yapar göreceksiniz nerede bazı sütunlar başka türler var. Bu nedenle, bazı sütunların int, bazılarının iki katı olduğu bir rapor oluşturmak mümkün değildir. ... IReport'taki genel kısıtlama bir tür belirttiğiniz için, tüm sütunlar için buna yapışmış olursunuz. Her sütun ... Ve gerçekten istediğim bu.
Hiç bir yere gitmediğimi ve muhtemelen gerçekten basit bir şeyi kaçırdığımı hissediyorum, bu yüzden doğru yönde bir dürtme takdir edilecektir.
TL; DR: Genel olmayan bir koleksiyonda genel bir koleksiyon nasıl alabilirim?
Raporunuzu "yeni bir IReport" olarak oluşturamaz mısınız? –
Baldrick
Şimdi görebildiğim kadarıyla, bu, IConvertible uygulama sınıfını değil, IConvertible olmasını beklediğinden, int veya double sütun eklememe izin vermiyor. –