Инстанцируйте объекта с определенным временем выполнения типом

Вам понадобится асинхронная / обратная версия exec. Возвращено 3 значения. Последние два - это стандартный вывод и стандартный вывод. Также child_process является источником событий. Послушайте событие exit. Первым элементом обратного вызова является код выхода. (Очевидно из синтаксиса, вы захотите использовать узел 4.1.1, чтобы код ниже работал так, как написано)

const child_process = require("child_process")
function systemSync(cmd){
  child_process.exec(cmd, (err, stdout, stderr) => {
    console.log('stdout is:' + stdout)
    console.log('stderr is:' + stderr)
    console.log('error is:' + err)
  }).on('exit', code => console.log('final exit code is', code))
}

Попробуйте следующее:

`systemSync('pwd')`

`systemSync('notacommand')`

И вы получит:

final exit code is 0
stdout is:/
stderr is:

Далее:

final exit code is 127
stdout is:
stderr is:/bin/sh: 1: notacommand: not found
60
задан abatishchev 24 January 2013 в 02:26
поделиться

4 ответа

Есть несколько способов создать объект определенного типа на лету, один из них:

// determine type here
var type = typeof(MyClass);

// create an object of the type
var obj = (MyClass)Activator.CreateInstance(type);

И вы получите экземпляр MyClass в obj.

Другой способ заключается в использовании отражения:

// get type information
var type = typeof(MyClass);

// get public constructors
var ctors = type.GetConstructors(BindingFlags.Public);

// invoke the first public constructor with no parameters.
var obj = ctors[0].Invoke(new object[] { });

И из одного из возвращенных ConstructorInfo вы можете «Invoke ()» с аргументами и получить обратно экземпляр класса, как если бы вы использовали «новый» оператор.

117
ответ дан 24 November 2019 в 17:37
поделиться

Думаю, вы ищете Activator.CreateInstance

10
ответ дан 24 November 2019 в 17:37
поделиться

Вы можете в основном делать то, что описываете, но поскольку вы не знаете тип во время компиляции, вам придется оставить экземпляр свободно- набранный; проверяйте его тип в каждой точке, в которой вы его используете, и затем соответствующим образом приводите его (это не потребуется для C # 4.0, который поддерживает динамику ):

Type type = CustomGetTypeMethod();
var obj = Activator.CreateInstance(type);

...


if(obj is MyCustomType)
{
    ((MyCustomType)obj).Property1;
}
else if (obj is MyOtherCustomType)
{
    ((MyOtherCustomType)obj).Property2;
}
15
ответ дан 24 November 2019 в 17:37
поделиться

Создание экземпляра среды выполнения Определить Тип легко, используя Activator.CreateInstance , как упоминалось другими. Однако кастуйте его, как в вашем примере, на Marshal. Строка PtrToStructure невозможна, так как тип должен быть известен во время компиляции для приведения. Также обратите внимание, что Activator.CreateInstance не может использоваться вместе с IntPtr.

Если ваши типы имеют общий базовый класс (кроме Object ), вы можете привести его к указанному базовому типу и вызовите на нем функции. В противном случае вызов функций будет возможен только с использованием отражения.

Так что либо:

static void castTest(myEnum val)
{
  //Call a native function that returns a pointer to a structure
  IntPtr val = someNativeFunction(..params..);

  //determine the type of the structure based on the enum value
  Type structType = getTypeFromEnum(val);

  BaseClass myStruct = (BaseClass)Marshal.PtrToStructure(IntPtr, structType);
  myStruct.SomeFunctionDeclaredInBaseClass();
}

Или:

static void castTest(myEnum val)
{
  //Call a native function that returns a pointer to a structure
  IntPtr val = someNativeFunction(..params..);

  //determine the type of the structure based on the enum value
  Type structType = getTypeFromEnum(val);

  object myStruct = Marshal.PtrToStructure(IntPtr, structType);
  MemberInfo[] function = FindMembers(MemberTypes.Method, BindingFlags.Public | BindingFlags.Instance,
    (MemberFilter)delegate(MemberInfo info, object filter)
    {
      return info.Name == filter.ToString();
    }, "SomeFunction");
  if (mi.Length > 0 && mi[0] is MethodInfo)
    ((MethodInfo)mi[0]).Invoke(myStruct, ..params..);
}
6
ответ дан 24 November 2019 в 17:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: