Как я могу динамически создавать и сохранять объект LINQ-to-SQL через отражение? - PullRequest
2 голосов
/ 04 декабря 2009

Следующий метод создает объект linq-to-sql в время выполнения на основе имени класса .

Я также могу заполнить свойства предмета с помощью отражения.

Но как мне сохранить этот объект с помощью команд linq-to-sql, если я не знаю во время выполнения, какой это тип?

public void CreateItem(string className)
{
    //create instance of item
    string classNamespaceAndName = "TestApp.Models." + className;
    Type itemType = Type.GetType(classNamespaceAndName);
    item = (object)Activator.CreateInstance(itemType, new Object[] { });

    //fill properties through reflection

    //save item to the database
    db.?????.InsertOnSubmit(item as itemType);  //error
    db.SubmitChanges();
}

Ответы [ 2 ]

3 голосов
/ 04 декабря 2009

Если у вас есть контекст данных, вы можете просто использовать:

ctx.GetTable(itemType).InsertOnSubmit(item);

К счастью, LINQ-to-SQL очень простителен ...

Одно предупреждение, однако - безопаснее использовать assembly.GetType(string) (для экземпляра Assembly), Type.GetType(string).

Этот и многие аналогичные материалы описаны в серии записей блога , начинающихся здесь , в которых описывается написание уровня ADO.NET Data Services для LINQ-to-SQL (который сталкивается с подобными проблемами).

2 голосов
/ 04 декабря 2009

Я думаю, вам нужен еще один общий метод, который будет делать вставку Linq следующим образом

public void Insert<T>(T obj) where T : class
{
     using (var db = GetData())
     {
         db.GetTable<T>().InsertOnSubmit(obj);
         db.SubmitChanges();
     }
}

Тогда из вашего метода вы вызываете этот метод:

public void CreateItem(string className)
{    
     string classNamespaceAndName = "TestApp.Models." + className;    
     Type itemType = Type.GetType(classNamespaceAndName);    
     item = (object)Activator.CreateInstance(itemType, new Object[] { });    
     this.insert(item);

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...