मैं एक साधारण रिपोर्टिंग टूल बनाने की कोशिश कर रहा हूं, जहां कोई उपयोगकर्ता केपीआई, चार्ट, कुल फ़ंक्शन और अन्य पैरामीटर के सेट से चयन कर सकता है, एक बटन क्लिक करें, जिसके बाद एक डब्ल्यूसीएफ सेवा कहा जाता है, जो तब सभी डेटा के साथ एक कस्टम मॉडल देता है। यह तब एक एमवीसी/डब्ल्यूपीएफ आवेदन में प्रदर्शित किया जा सकता है (दोनों हो सकता है)।सेमी-विज्ञापन रिपोर्ट रिपोर्ट के लिए जेनेरिक इंटरफेस
चूंकि उपयोगकर्ता कई देशों से हो सकते हैं, इसलिए मैं सभी संख्याओं और शीर्षकों को चित्रित करने के लिए डेटा एनोटेशन का उपयोग करना चाहता हूं जो वर्तमान उपयोगकर्ता के लिए उपयोग की जाने वाली भाषा और संख्या प्रारूपों के अनुकूल है।
डेटा की लोडिंग और वह सब कुछ ठीक काम कर रहा है, कोई समस्या नहीं है। साथ ही, मैं डेटा एनोटेशन का उपयोग करता हूं, इसलिए सभी भाषा/संस्कृति-विशिष्ट सेटिंग्स की देखभाल की जाती है। समस्या तब शुरू होती है जब मैं उस मॉडल में सभी डेटा डालने का प्रयास करता हूं जिसे मैं उपयोगकर्ता को प्रदर्शित करना चाहता हूं।
जो मैं करने की कोशिश कर रहा हूं वह एक रिपोर्ट क्लास है, जिसमें कॉलम का संग्रह होता है। प्रत्येक कॉलम int/double/... मानों की एक सूची हो सकती है। अब, चूंकि मैं डब्ल्यूसीएफ से निपट रहा हूं और उपरोक्त स्पष्टीकरण का अर्थ है (जहां तक मैं समझता हूं) जेनेरिकों का उपयोग, मुझे लगता है कि मैं कक्षाओं/डब्ल्यूसीएफ संचालन के लिए [ज्ञात टाइप] या [सर्विसकनाउन टाइप] का उपयोग कर सकता हूं, जबकि वास्तव में वापसी मूल्य के रूप में आधार प्रकार या इंटरफ़ेस। वास्तव में कभी भी यह कोशिश नहीं की, लेकिन मुझे कुछ अच्छी स्पष्टीकरण मिली जो मेरे लिए बहुत तार्किक लगती हैं, इसलिए मुझे लगता है कि इस भाग के लिए मेरे पास कोई बड़ा मुद्दा नहीं होगा (कम से कम मुझे उम्मीद है)।
अभी, मेरी इंटरफेस के रूप में कर रहे हैं इस तरह के (वास्तविक समस्या मेरे पास है पर ध्यान केंद्रित करने के लिए सरल):
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; } }
चूंकि प्रत्येक स्तंभ में मान हो सकता है किसी पूर्णांक/डबल/..., मुझे लगता है मैं (मुझे नहीं लगता कि मैं एक संग्रह के प्रकार पर एक डेटा एनोटेशन विशेषता का उपयोग कर सकते हैं) बस मूल्य के लिए एक वास्तविक वर्ग होना आवश्यक है, जैसे:
public class IntValue: IValue<int>
{
[DisplayFormat(DataFormatString = "{0:#,##0;-#,##0;'---'}", ApplyFormatInEditMode = true)]
public int Value { get; set; }
}
बेशक
, कि अजीब लग रहा है, जब से तुम सिर्फ कर सकता इसे एक सामान्य वर्ग मान बनाएं जो IValue लागू करता है और इसके साथ किया जाता है, लेकिन अगर मैं मूर्खतापूर्ण चीज करता हूं और प्रत्येक संभावित प्रकार के लिए एक वर्ग बनाएं (अब जब मैं इसे टाइप करता हूं, जो वास्तव में खराब लगता है, मुझे पता है), मैं DisplayFormat विशेषता का उपयोग कर सकता हूं और इस बारे में चिंता करने की ज़रूरत नहीं है कि यह उपयोगकर्ता को स्वयं पेश करेगा, यह ' हमेशा उपयुक्त होगा।
अब, कक्षाओं कि IColumn और iReport को लागू करने के लिए, कि सरल है:
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>>(); }
}
अंतरफलक और वर्गों की सूची से, आप तुरंत देखेंगे कि यह यह असंभव एक रिपोर्ट वाला राज्य बन गया है जहां कुछ कॉलम अन्य प्रकार हैं। इसलिए एक रिपोर्ट बनाना संभव नहीं है जहां कुछ कॉलम int हैं, कुछ डबल हैं, ... क्योंकि आईरपोर्ट में जेनेरिक बाधा आपको एक प्रकार निर्दिष्ट करती है, इसलिए आप सभी कॉलम के लिए इसके साथ अटक जाते हैं, क्योंकि यह मूल्य के अनुपात में फैलता है प्रत्येक कॉलम ... और यह वही है जो मैं वास्तव में चाहता हूं।
मुझे लगता है कि मुझे कहीं भी नहीं मिल रहा है, और शायद कुछ वास्तव में सरल याद आ रहा है, इसलिए सही दिशा में एक झुकाव की सराहना की जाएगी।
टीएल; डीआर: मैं गैर-सामान्य प्रकार में एक सामान्य संग्रह कैसे प्राप्त करूं?
क्या आप अपनी रिपोर्ट को 'नया आईआरपोर्ट' के रूप में नहीं बना सकते? –
Baldrick
जहां तक मैं अब देख सकता हूं, यह मुझे एक इंट या डबल कॉलम जोड़ने की अनुमति नहीं देता है, क्योंकि यह अपेक्षा करता है कि उन्हें आईसीओन्वरिबल हो, और कोई भी आईकोनवर्टेबल कार्यान्वयन वर्ग नहीं। –