type
TBaseObj = class;
TBaseObjClass = class of TBaseObj;
TMyObj1 = class(TBaseObj)
end;
TMyObj2 = class(TBaseObj)
end;
procedure xxx1;
begin
xxx2(TMyObj1);
end;
procedure xxx2(obj_class: TBaseObjClass);
var
Obj: TBaseObj;
begin
Obj := obj_class.Create;
....
end;
т.е. в функции xxx2 создается объект тип которого передается в функцию параметром. Собственно вопрос, как сие организовать в C#? Это очень важно... Помогите кто может.
using System;
public interface IFruit
{
void Eat();
}
public class Apple : IFruit
{
public void Eat()
{
Console.WriteLine("Вкусное яблоко!");
}
}
public class Pear : IFruit
{
public void Eat()
{
Console.WriteLine("Вкусная груша!");
}
}
public class Program
{
public static void Main()
{
Type[] fruitTypes = new Type[]{typeof(Apple), typeof(Pear)};
foreach(Type fruitType in fruitTypes)
{
IFruit fruit = CreateFruit(fruitType);
fruit.Eat();
}
}
public static IFruit CreateFruit(Type ofThisType)
{
return (IFruit) Activator.CreateInstance(ofThisType);
}
}
Здравствуйте, jonny210, Вы писали:
J>т.е. в функции xxx2 создается объект тип которого передается в функцию параметром. Собственно вопрос, как сие организовать в C#? Это очень важно... Помогите кто может.
Вот, например, как можно создать объекта, когда его тип известен только в рантайме
Type t = typeof(System.Text.StringBuilder);
System.Reflection.ConstructorInfo ci = t.GetConstructor(Type.EmptyTypes); // конструктор без параметровobject o = ci.Invoke(null); // вызов конструктора
Console.WriteLine(o.GetType());
А вообще я бы писал на том языке, который лучше знаю.
.NET позволяет использовать типы, реализованные на одном NET-совместимом языке, из другого языка
J>т.е. в функции xxx2 создается объект тип которого передается в функцию параметром. Собственно вопрос, как сие организовать в C#? Это очень важно... Помогите кто может.
Классы:
class BaseObj {}
class MyObj1: BaseObj {}
class MyObj2: BaseObj {}
Ближе всего наверно будет следующий вариант:
class Program
{
void xxx1()
{
xxx2(typeof(MyObj1));
}
void xxx2(Type objType)
{
BaseObj obj = (BaseObj)Activator.CreateInstance(objType);
}
}
Или вот такой:
class Program
{
void xxx1()
{
xxx2(typeof(MyObj1));
}
void xxx2<T>() where T: BaseObj
{
BaseObj obj = Activator.CreateInstance<T>();
}
}
Здравствуйте, vhonest, Вы писали:
V>Здравствуйте, jonny210, Вы писали:
J>>т.е. в функции xxx2 создается объект тип которого передается в функцию параметром. Собственно вопрос, как сие организовать в C#? Это очень важно... Помогите кто может.
V>Вот, например, как можно создать объекта, когда его тип известен только в рантайме V>
Type t = typeof(System.Text.StringBuilder);
V> System.Reflection.ConstructorInfo ci = t.GetConstructor(Type.EmptyTypes); // конструктор без параметров
V> object o = ci.Invoke(null); // вызов конструктора
V> Console.WriteLine(o.GetType());
V>
V>А вообще я бы писал на том языке, который лучше знаю. V>.NET позволяет использовать типы, реализованные на одном NET-совместимом языке, из другого языка
Спасибо что откликнулись. Но есть проблема. Параметры конструктора. когда я объявляю переменную так:
var o: class of TMyObj;
при создании объекта компилятор точно знает какие параметры я должен передать конструктору. Если я изменю конструктор объекта код просто не скомпилируется... Мне не нужно полностью динамическое создание объекта...
И еще вопрос. При наследовании объектов в C# конструктор почему то не наследуется...(((
class Obj1
{
public Obj1(int x);
}
class Obj2 : Obj1
{
}
...
Obj2 obj = new Obj2(10);
Последняя строчка не скомпилируется потом что Obj2 ничего незнает о конструкторе из Obj1... Неужели из обязательно нужно переобъявлять?
J>Последняя строчка не скомпилируется потом что Obj2 ничего незнает о конструкторе из Obj1... Неужели из обязательно нужно переобъявлять?
17.10.1 Constructor initializers
All instance constructors (except those for class object) implicitly include an invocation of another
instance constructor immediately before the constructor-body. The constructor to implicitly invoke is
determined by the constructor-initializer:
• An instance constructor initializer of the form base(argument-listopt) causes an instance constructor
from the direct base class to be invoked. That constructor is selected using argument-list and the
overload resolution rules of §14.4.2. The set of candidate instance constructors consists of all accessible
instance constructors declared in the direct base class, or the default constructor (§17.10.4), if no
instance constructors are declared in the direct base class. If this set is empty, or if a single best instance
constructor cannot be identified, a compile-time error occurs.
...
<skipped>
...
If an instance constructor has no constructor initializer, a constructor initializer of the form base() is
implicitly provided. [Note: Thus, an instance constructor declaration of the form
Здравствуйте, jonny210, Вы писали:
J>И еще вопрос. При наследовании объектов в C# конструктор почему то не наследуется...((( J>... Неужели из обязательно нужно переобъявлять?
Inheritance means that a class implicitly contains all members of its direct base class, except for the instance constructors, destructors and static constructors of the base class. (MSDN)
Да, обязательно. Конструкторы не наследуются. Но Вы можете явно делегировать вызов конструктору базового класса.
class Obj1
{
protected int _x;
public Obj1(int x)
{
_x = x;
}
}
class Obj2 : Obj1
{
public Obj2(int x) : base(x)
{
}
}
Здравствуйте, jonny210, Вы писали:
J>Но есть проблема. Параметры конструктора. когда я объявляю переменную так: J>
J>var o: class of TMyObj;
J>
J>при создании объекта компилятор точно знает какие параметры я должен передать конструктору. Если я изменю конструктор объекта код просто не скомпилируется... Мне не нужно полностью динамическое создание объекта...
Опишите подробнее, какое поведение Вы бы хотели получить.
Здравствуйте, nikov, Вы писали:
N>Здравствуйте, jonny210, Вы писали:
J>>Но есть проблема. Параметры конструктора. когда я объявляю переменную так: J>>
J>>var o: class of TMyObj;
J>>
J>>при создании объекта компилятор точно знает какие параметры я должен передать конструктору. Если я изменю конструктор объекта код просто не скомпилируется... Мне не нужно полностью динамическое создание объекта...
N>Опишите подробнее, какое поведение Вы бы хотели получить.
Есть базовый класс, и куча наследников...
public class Base
{
public Base(int x)
{
...
}
}
public class Child1 : Base
{
public Child1(int x) : base (x)
{
}
}
public class Child2 : Base
{
public Child2(int x) : base (x)
{
}
}
public class Child3 : Base
{
public Child3(int x) : base (x)
{
}
}
теперь есть процедура которая должна создавать объект класс которого передается параметром
public string xxx(Base class_type)
{
Base obj = class_type(10);
obj.GetType().ToString();
}
я знаю что так делать нельзя, но как это сделать в C# я не знаю...
и из основного кода я делаю
xxx(Child1);
xxx(Child2);
xxx(Child3);
Вот такая у меня заморочка... В Delphi это все элементарно делается...
using System;
public class Base
{
protected int _x;
public Base(int x)
{
_x = x;
}
public void GetX()
{
Console.WriteLine(_x);
}
}
public class Child1 : Base
{
public Child1(int x) : base(x)
{
}
}
public class Child2 : Base
{
public Child2(int x) : base(x)
{
}
}
public class Child3 : Base
{
public Child3(int x) : base(x)
{
}
}
public class Program
{
public static void Main()
{
Type[] childTypes = new Type[]{typeof(Child1), typeof(Child2), typeof(Child3)};
foreach(Type type in childTypes)
{
Base child = xxx(type);
child.GetX();
Console.WriteLine(child.GetType());
}
}
public static Base xxx(Type childType)
{
return (Base) Activator.CreateInstance(childType, 10); /* второй параметр будет передан в конструктор */
}
}