Вам понадобится асинхронная / обратная версия 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
Есть несколько способов создать объект определенного типа на лету, один из них:
// 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 ()» с аргументами и получить обратно экземпляр класса, как если бы вы использовали «новый» оператор.
Вы можете в основном делать то, что описываете, но поскольку вы не знаете тип во время компиляции, вам придется оставить экземпляр свободно- набранный; проверяйте его тип в каждой точке, в которой вы его используете, и затем соответствующим образом приводите его (это не потребуется для 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;
}
Создание экземпляра среды выполнения Определить Тип
легко, используя 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..);
}