2012-10-22 15 views
5

मैं FFG कन्वर्ट करने के लिए कोशिश कर रहा हूँ :,गतिशील वस्तु अपने तरीकों दिखाई नहीं दे

यह काम करता है

IResultSEt rs = db.SELECT.COLUMNS(db.GetTable(data.ToString()).ColumnNames).FROM(data.ToString()).Execute(); 
इस में

, जो काम नहीं करता,

dynamic rs = db.SELECT.COLUMNS(db.GetTable(data.ToString()).ColumnNames); 
      rs = rs.FROM(data.ToString()); 
      rs = rs.Execute(); 

यह देता है मुझे एक त्रुटि है कि इसे "COLUMNS" नहीं मिल रहा है।

जबकि डीबगिंग, यह है कि रु सभी वापसी तरीकों और निजी चर चयन कक्षा में यह सिर्फ ऊपर विधि रनटाइम पर चयन कक्षा में कॉलम की तरह उठा नहीं है चुना जा रहा है लगता है। यह बहुत अजीब है, मुझे उम्मीद है कि यह विधियों को भी उठाएगा, मैं कुछ गलत कर रहा हूं ???

अद्यतन

db .SELECT.COLUMNS (db.GetTable (data.ToString()) COLUMNNAMES।) में db के लिए परिभाषा;

public class Database 
{ 
    private Dictionary<string, ITable> _tables = new Dictionary<string, ITable>(); 

    public ITable AddTable(string tableName, string[]columnNames, Type[] columnTypes) 
    { 
     ITable tbl = new Table(tableName); 
     tbl.SetColumns(columnNames, columnTypes); 
     _tables.Add(tableName.ToUpper(), tbl); 

     return tbl; 
    } 

    public ITable GetTable(string tableName) 
    { 
     return _tables[tableName.ToUpper()]; 
    } 

    public ISELECT SELECT 
    { 
     get 
     { 
      ISELECT select = new SELECT(this); 
      return select; 
     } 
    } 

    public Dictionary<string,ITable> getTables() 
    { 
     return _tables; 
    } 
} 

के लिए परिभाषा का चयन करें DB में है। चुनें .COLUMNS (डीबी। गेटटेबल (डेटा.ToString())। कॉलमनाम); जो मेरे के लिए एक इंटरफ़ेस है वर्ग चुनें;

public interface ISELECT 
{ 
    ISELECT TOP(Int32 N); 
    ISELECT DISTINCT { get; } 
    ISELECTCOLUMN COLUMN(string columnName); 
    ISELECTTABLECOLUMN COLUMN(string tableName, string columnName); 
    ISELECTCOLUMNS COLUMNS(params string[] columnNames); 
    ISELECTSUMCOLUMN SUM(string columnName); 
    ISELECTSUMCOLUMN SUM(string tableName, string columnName); 
} 

यह जहां समस्या है, गतिशील वस्तु इंटरफ़ेस में तरीकों उठा नहीं है, यह सब निजी चर ऊपर उठाता है और एकमात्र तरीका यह ऊपर उठाता है "अलग" है

नीचे SELECT क्लास की परिभाषा का हिस्सा है, इसमें बहुत सारे कोड हैं इसलिए मैं थोड़ा सा रखूंगा;

internal class SELECT : ISELECT, ISELECTInternals 
{ 
    private Database _dw; 
    private bool _DISTINCT; 
    private Int32 _TOPN = -1; 
    private List<Int32> _JOINNumbers = new List<Int32>(); 
    private string[] _selectJOINLHScolumnTableNames; 
    private string[] _selectJOINLHScolumnNames; 
    private string[] _selectJOINRHScolumnTableNames; 
    private string[] _selectJOINRHScolumnNames; 
    private string[] _selectcolumnTableNames; 
    private string[] _selectcolumnNames; 
    private string[] _selectcolumnAliases; 
    private object[] _selectcolumnLiterals; 
    private string[] _selectcolumnStringTemplates; 
    private AggregateTypes[] _selectcolumnAggregates; 
    private string[] _queryTableNames; 
    private string _SUMcolumnName; 
    private string _FROMTableName; 
    private List<string> _INNERJOINTableNames = new List<string>(); 
    private List<string> _JOINTableNames = new List<string>(); 
    private List<JoinTypes> _TableJoinTypes = new List<JoinTypes>(); 
    private bool _takeANDFlag = true; 
    private List<string> _filterColumnTableNames = new List<string>(); 
    private List<string> _filterColumnNames = new List<string>(); 
    private List<object[]> _filterColumnValues = new List<object[]>(); 
    private List<string> _GROUPBYcolumnTableNames = new List<string>(); 
    private List<string> _GROUPBYcolumnNames = new List<string>(); 

आदि

+4

जब हम कार्यान्वयन के बारे में कुछ भी नहीं जानते हैं तो यह मदद करना मुश्किल है। क्या आप अधिक जानकारी दे सकते हैं, या आदर्श रूप से एक छोटा लेकिन पूरा उदाहरण? क्या आप कहीं भी स्पष्ट अंतरफलक कार्यान्वयन का उपयोग कर रहे हैं? –

+0

@ जोन मैंने अपनी पोस्ट संपादित की है, अगर आपको कोई और जानकारी चाहिए तो मुझे बताएं, कोड के बहुत सारे पेस्ट नहीं करना चाहते हैं, अपठनीय हो सकता है। – Dreamer78692

+0

असफल होने पर अधिक जानकारी चाहिए। आप ISELECTCOLUMNS इंटरफ़ेस को परिभाषित करते हैं? – Hagashen

उत्तर

1

कुछ बदल दिया है गया है। किसी विशेष अभिव्यक्ति पर कब्जा कर लिया गया है या नहीं, यह बदलने से पहले यह मान/संदर्भ को संग्रहीत करने से पहले अपवाद फेंकने का कारण नहीं बनता है।

शायद का उपयोग कर बयान या अन्य प्रकार बदल दिया है और आप एहसास नहीं था कि लाइन

IResultSEt rs = db.SELECT.COLUMNS(db.GetTable(data.ToString()).ColumnNames) 

की सफलता और लाइन

dynamic rs = db.SELECT.COLUMNS(db.GetTable(data.ToString()).ColumnNames); 

की विफलता के बीच है, लेकिन यह पता लगाने में नाकाम रहने पर डीबी पर एक विधि का मतलब है कि या तो डीबी का प्रकार बदल गया है या विस्तार विधियों को आयात करने वाले उपयोग बदल गए हैं।

मुझे पुन: स्थापित करने का प्रयास करें। भंडारण के बाईं तरफ इसका कोई प्रभाव नहीं पड़ता है कि सही दाहिने तरफ मूल्यांकन किए जाने तक सही पक्ष का मूल्यांकन कैसे किया जाता है। (बाईं तरफ के लिए लेखांकन नहीं है Expression<Func<>> बनाम।Func<>)

मुझे लगता है कि जब आप इस सवाल को एक साथ रखते हैं तो प्रश्न में पोस्ट किए गए प्रश्न या स्रोत कोड में जिम्मेदार नहीं होने के बाद और अधिक बदल गया है।

संबंधित मुद्दे