Priya-Kiko Ответов: 2

Как создать экземпляр объекта из имени класса сущностей в строке


Привет,

Я хочу создать экземпляр объекта класса, имя которого получено во время выполнения.

var restlist = oContext.rests.ToList();
foreach(rest r in restlist)
{
     if (TableExists("bil" + r.code))
     {
           // want to instantiate an object of "bil"+r.code entity and access the 
           // properties of that class
     }
}


Возможно ли это таким образом в Entity Frawework ? Пожалуйста, предложите правильный способ сделать это. Заранее спасибо.

Что я уже пробовал:

Попробовал использовать активатор.Метод createinstance
String mfilename = "Test.bil" + r.code;
Object obj = Activator.CreateInstance(Type.GetType(mfilename));
// then here how to use this class and declare an object and get the properties

2 Ответов

Рейтинг:
17

OriginalGriff

Попробовать это:

public class MyBaseClass
    {
    public int I;
    public string S;
    }
public class MyClass : MyBaseClass
    {
    ...
    }
private void MyButton_Click(object sender, EventArgs ew)
    {
    string myClassName = "GeneralTesting.frmMain+MyClass";
    Type t = Type.GetType(myClassName);
    MyBaseClass mbc = (MyBaseClass)Activator.CreateInstance(t);
    mbc.S = "hello";


Priya-Kiko

Спасибо Вам за ответ.

Класс, который я пытаюсь создать, - это класс таблиц (или класс сущностей) , созданный Entity Framework. Какой класс я должен использовать в качестве базового класса здесь ??

OriginalGriff

Вот в чем проблема с динамическим созданием типов и попыткой использовать их из статического кода: если вы не можете предоставить класс для их приведения, вы не можете получить доступ к свойствам, методам, полям, событиям ... непосредственно в коде, потому что вы не можете его скомпилировать, вам нужно использовать отражение для доступа к ним (что является медленным, грязным и трудным для чтения).
Помните, чтобы получить доступ к свойству класса непосредственно в коде, вам нужен экземпляр этого класса в соответствующей типизированной переменной. В моем примере, если бы MyClass имел свойство "Foo", вы все равно не могли бы получить доступ к нему через переменную mbc, потому что не все типы, которые могут быть в переменной, будут иметь свойство "Foo", вместо этого они могут иметь "Bar".

Не имеет значения, является ли это EF или vanilla C#, если вы не знаете, какой это тип во время компиляции (или используете динамические переменные), вы не можете получить доступ к свойствам или методам, кроме как путем отражения. (А dynamic только обходит проверку времени компиляции, она все равно завершится неудачей, если экземпляр не имеет этого свойства во время выполнения.)

Priya-Kiko

Хорошо. Огромное спасибо.

OriginalGriff

Всегда пожалуйста!

Рейтинг:
1

AnkushK1

Возможно, вы не указываете полностью квалифицированное пространство имен класса, который будет создан.

string formTypeFullName = string.Format("{0}.{1}", this.GetType().Namespace, "<class_name>"); 
		Type type = Type.GetType(formTypeFullName, true);
		object obj = Activator.CreateInstance(type);