2012-10-22 17 views
5

Próbuję przekonwertować FFG :,Dynamiczny obiekt nie pokazując swoje metody

Działa

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

do tego, co nie działa,

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

Daje mi błąd, że nie może znaleźć "COLUMNS".

podczas debugowania, wydaje się, że rs jest podniesienie wszystkich metod zwróci i zmienne prywatne w SELECT klasy po prostu nie podnosząc sposób jak kolumny w SELECT klasy w czasie wykonywania. To jest bardzo dziwne, spodziewałem się, że to także zabierze metody, robię coś złego ???

UPDATE

definicja db w db .SELECT.COLUMNS (db.GetTable (data.ToString()) ColumnNames.); jest

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; 
    } 
} 

definicja SELECT w dB. SELECT .KOLUMNS (db.GetTable (data.ToString()). ColumnNames); który jest interfejsem do mojej klasy SELECT;

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); 
} 

To gdzie leży problem, dynamiczny obiekt nie jest podniesienie metody w interfejsie, to podnosi wszystkie zmienne prywatne i jedyna metoda to podnosi to „odrębne”.

Poniżej znajduje się część definicji klasy SELECT, jest w niej dużo kodu, więc po prostu dodam trochę;

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>(); 

itp

+4

Trudno jest pomóc, gdy nie wiemy nic o implementacji. Czy mógłbyś podać więcej informacji, lub najlepiej krótki, ale kompletny przykład? Czy używasz jawnej implementacji interfejsu w dowolnym miejscu? –

+0

@Jon Edytowałem mój post, jeśli potrzebujesz więcej informacji daj mi znać, nie chcesz wkleić dużo kodu, może stać się nieczytelne. – Dreamer78692

+0

Potrzebujesz więcej informacji na temat awarii. Co definiujesz interfejs ISELECTCOLUMNS? – Hagashen

Odpowiedz

1

Coś innego musi się zmienić. Zmienianie miejsca, w którym przechwycone jest określone wyrażenie, nie powoduje odrzucenia wyjątku przed zapisaniem wartości/odwołania.

Być może za pomocą oświadczenia lub innego rodzaju uległy zmianie i nie zdawali sobie sprawy, że od sukcesu linii

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

i awarii linii

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

ale w przypadku braku na lokalizowanie metoda na db oznacza, że ​​albo zmieniono typ db, albo zmieniły się zastosowania importujące metody rozszerzania.

Pozwól mi spróbować ponownie. Lewa strona pamięci nie ma wpływu na ocenę prawej strony, dopóki cała prawa strona nie zostanie wykonana. (nie rozlicza się po lewej stronie, mówiąc: Expression<Func<>> vs.Func<>)

Wydaje mi się, że zmieniło się więcej, odkąd połączyłeś pytanie, które nie zostało uwzględnione w pytaniu lub w kodzie źródłowym zamieszczonym w pytaniu.

Powiązane problemy