2012-10-22 40 views
5

Tôi cố gắng để chuyển đổi các ffg :,đối tượng động không hiển thị phương pháp của nó

này Làm việc

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

thành này, mà không làm việc,

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

Nó cung cấp cho một lỗi mà nó không thể tìm thấy "COLUMNS".

Trong khi gỡ lỗi, có vẻ như rs được chọn lên tất cả các phương pháp trở lạibiến tin trong lớp CHỌN nó chỉ là không nhặt phương pháp như COLUMNS trong lớp CHỌN khi chạy. Điều này là rất kỳ quặc, tôi mong đợi nó cũng nhận các phương pháp, tôi đang làm điều gì sai?

CẬP NHẬT

Định nghĩa cho db trong db .SELECT.COLUMNS (db.GetTable (data.ToString()) COLUMNNAMES.); là

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

Định nghĩa cho CHỌN trong db. SELECT .COLUMNS (db.GetTable (data.ToString()). ColumnNames); đó là giao diện cho lớp học SELECT của tôi;

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

Đây là nơi mà vấn đề nằm, đối tượng động không được chọn lên các phương pháp trong giao diện, nó nhặt tất cả các biến tư nhân và phương pháp duy nhất nó nhặt là "DISTINCT".

Dưới đây là một phần của định nghĩa của lớp SELECT, có rất nhiều mã trong nó vì vậy tôi sẽ chỉ cần đặt một chút;

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

, vv

+4

Thật khó để giúp đỡ khi chúng tôi không biết gì về việc triển khai. Bạn có thể cung cấp thêm thông tin hay lý tưởng cho một ví dụ ngắn nhưng đầy đủ? Bạn đang sử dụng triển khai giao diện rõ ràng ở bất kỳ đâu? –

+0

@Jon Tôi đã chỉnh sửa bài đăng của mình, nếu bạn cần bất kỳ thông tin nào khác cho tôi biết, không muốn dán nhiều mã, có thể trở thành không thể đọc được. – Dreamer78692

+0

Cần thêm chi tiết về những gì không thành công. Bạn xác định giao diện ISELECTCOLUMNS nào? – Hagashen

Trả lời

1

Cái gì khác có như đã thay đổi. Thay đổi vị trí hoặc nếu một biểu thức cụ thể được chụp không làm cho nó ném một ngoại lệ trước khi nó lưu trữ giá trị/tham chiếu.

Có lẽ sử dụng báo cáo hoặc các loại đã thay đổi và bạn đã không nhận ra rằng giữa sự thành công của dòng

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

và sự thất bại của dòng

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

nhưng nó thất bại trên định vị một phương thức trên db có nghĩa là một trong hai loại db đã thay đổi hoặc sử dụng các phương thức nhập khẩu đã thay đổi.

Hãy để tôi cố gắng nghỉ ngơi. Phía bên trái của lưu trữ KHÔNG có hiệu lực về cách bên phải được đánh giá cho đến khi toàn bộ bên phải được thực hiện đánh giá. (không tính toán phía bên trái cho biết Expression<Func<>> so vớiFunc<>)

Tôi nghĩ rằng nhiều thay đổi hơn kể từ khi bạn đặt câu hỏi cùng nhau không được tính vào câu hỏi hoặc mã nguồn được đăng trong câu hỏi.

Các vấn đề liên quan