c # установить значения столбца DataContext без строгого ввода

        //Instead of the this 
        var tableX = db.PRODUCT; //db is the DataContext
        //I can do the below (Thanks to http://stackoverflow.com/questions/1919632/get-table-data-from-table-name-in-linq-datacontext
        string tablename = "PRODUCT";
        var table = (ITable)db.GetType().GetProperty(tablename).GetValue(db, null);

        //But instead of this
        PRODUCT _Product = new PRODUCT();
        _Product.PRD_CODE = "code1";
        _Product.PRD_DESC = "description1";
        table.InsertOnSubmit(_Product);
        db.SubmitChanges();

        //How can I do something like this
        string tablename = "PRODUCT";
        var table = (ITable)db.GetType().GetProperty(tablename).GetValue(db, null);
        string lsColumnPrdCode = "PRD_CODE";
        string lsColumnPrdDesc = "PRD_DESC";
        table _tableInstance = new table();
        _tableInstance[lsColumnPrdCode] = "code1";
        _tableInstance[lsColumnPrdDesc] = "description1";
        _tableInstance.InsertOnSubmit(_tableInstance);
        db.SubmitChanges();

Значит, можно установить значения столбца datacontext, не набирая его строго?


person Jeyanth    schedule 19.09.2011    source источник
comment
Это определенно возможно. В конце концов, C # - рефлексивный язык. Мы сделали это в нашем проекте. Но это слишком много кода. Я устала.   -  person Nawaz    schedule 19.09.2011


Ответы (1)


Конечно, вы можете использовать отражение для подобных вещей. Может быть, что-то похожее на этот код:

Type productType = Type.GetType("PRODUCT");
var product = Activator.CreateInstance(productType);
productType.GetProperty("PRD_CODE").SetValue(product, "code1");
productType.GetProperty("PRD_DESC").SetValue(product, "description1");

Type tableType = table.GetType();
tableType.GetMethod("InsertOnSubmit").Invoke(table, new object[] {product});

Но почему вы хотите это сделать?

person Jan    schedule 19.09.2011
comment
Спасибо, Ян. У меня есть более 50 таблиц со справочными данными, и эти данные обновляются из значений, взятых из XML (загруженного через веб-службы). Имена таблиц и столбцов - это имена элементов в XML, и вместо того, чтобы вводить одну процедуру для каждой таблицы, я надеялся сделать ее универсальной, чтобы одна процедура обрабатывала все таблицы на основе имени элемента XML. Я сделал это в C # (используя команды DataTable и TabelDirect) без DataContext и на Java (на базе Android) и хотел сделать то же самое в WindowsPhone 7. Я использую XmlReader для чтения. - person Jeyanth; 19.09.2011
comment
Введите productType = db.GetType (). GetProperty (PRODUCT) .GetValue (db, null) .GetType (); var product = Activator.CreateInstance (productType); // Выдает ошибку не найден конструктор без параметров (methodmissingexception) // Итак, попробовал ... var ctor = productType.GetConstructor (new Type [] {}); var obj = ctor.Invoke (новый объект [] {}); // По-прежнему ошибка, поскольку значение ctor равно нулю. Какие-либо предложения? - person Jeyanth; 20.09.2011
comment
Если в вашем классе PRODUCT нет конструктора без параметров, вы должны указать значения параметров в вызове CreateInstance. - person Jan; 20.09.2011
comment
Спасибо, Ян. Ваш первоначальный код - правильный ответ. Что я упустил, так это то, что в первой строке мне нужно было ввести полное имя сборки вместо просто PRODUCT, так что это было что-то вроде MYASSEMBLY.PRODUCT. Как только я это сделал, все заработало. Спасибо за вашу помощь. - person Jeyanth; 20.09.2011