Man kann nicht immer wissen, welche Type
eines Objekts zur Kompilierzeit, sondern müssen möglicherweise eine Instanz der Type
.
Wie erhält man eine neue Objektinstanz aus einer Type
?
Man kann nicht immer wissen, welche Type
eines Objekts zur Kompilierzeit, sondern müssen möglicherweise eine Instanz der Type
.
Wie erhält man eine neue Objektinstanz aus einer Type
?
Wenn es sich um etwas handelt, das in einer Anwendungsinstanz häufig aufgerufen wird, ist es viel schneller, dynamischen Code zu kompilieren und zwischenzuspeichern, anstatt den Aktivator oder ConstructorInfo.Invoke()
. Zwei einfache Optionen für die dynamische Kompilierung werden kompiliert Linq-Ausdrücke oder eine einfache IL
Opcodes und DynamicMethod
. So oder so, der Unterschied ist enorm, wenn man in enge Schleifen gerät oder mehrere Anrufe tätigen muss.
Wenn Sie den Standardkonstruktor verwenden möchten, dann ist die Lösung mit System.Activator
ist wahrscheinlich die bequemste. Wenn der Typ jedoch keinen Standardkonstruktor hat oder Sie einen nicht standardmäßigen Konstruktor verwenden müssen, besteht eine Möglichkeit darin, die Reflexion oder System.ComponentModel.TypeDescriptor
. Bei der Reflexion reicht es aus, nur den Typnamen (mit seinem Namespace) zu kennen.
Beispiel mit Reflexion:
ObjectType instance =
(ObjectType)System.Reflection.Assembly.GetExecutingAssembly().CreateInstance(
typeName: objectType.FulName, // string including namespace of the type
ignoreCase: false,
bindingAttr: BindingFlags.Default,
binder: null, // use default binder
args: new object[] { args, to, constructor },
culture: null, // use CultureInfo from current thread
activationAttributes: null
);
Beispiel mit TypeDescriptor
:
ObjectType instance =
(ObjectType)System.ComponentModel.TypeDescriptor.CreateInstance(
provider: null, // use standard type description provider, which uses reflection
objectType: objectType,
argTypes: new Type[] { types, of, args },
args: new object[] { args, to, constructor }
);
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.