2010-07-15 15 views
69

Ich habe folgendes Szenario:C# Reflexion Mit einem Konstruktor aufrufen

class Addition{ 
public Addition(int a){ a=5; } 
public static int add(int a,int b) {return a+b; } 
} 

ich in einer anderen Klasse hinzufügen nenne:

string s="add"; 
typeof(Addition).GetMethod(s).Invoke(null, new object[] {10,12}) //this returns 22 

Ich brauche eine Art und Weise ähnlich der oben Reflexion Aussage Erstellen Sie ein neues Objekt vom Typ Addition mit Addition(int a)

So habe ich String s= "Addition", ich möchte ein neues Objekt mit Reflektion erstellen.

Ist das möglich?

+3

Warum möchten Sie Reflexion verwenden? Reflection kommt mit einer Leistungseinbuße, verursacht langfristig Wartungsprobleme ... –

+20

@Patrick, es gibt viele Fälle, in denen die Leistungseinbuße ignoriert werden kann, solange das Benutzerziel erreicht wird. – Kiril

Antwort

125

ich glaube nicht, GetMethod es tun, nein - aber GetConstructor Willen.

using System; 
using System.Reflection; 

class Addition 
{ 
    public Addition(int a) 
    { 
     Console.WriteLine("Constructor called, a={0}", a); 
    } 
} 

class Test 
{ 
    static void Main() 
    { 
     Type type = typeof(Addition); 
     ConstructorInfo ctor = type.GetConstructor(new[] { typeof(int) }); 
     object instance = ctor.Invoke(new object[] { 10 }); 
    } 
} 

EDIT: Ja, Activator.CreateInstance arbeiten. Verwenden Sie GetConstructor, wenn Sie mehr Kontrolle über die Dinge haben möchten, finden Sie die Parameternamen etc. Activator.CreateInstance ist großartig, wenn Sie nur möchten, den Konstruktor obwohl aufrufen.

+1

Ja, aber dann müssen Sie alle Überladungsauflösungsregeln implementieren, um den richtigen Konstruktor auszuwählen. Während die Laufzeit es für Sie tun wird, wenn Sie http://msdn.microsoft.com/en-us/library/wcxyzt4d.aspx aufrufen –

+3

So wird 'GetConstructor' bevorzugt, wenn Sie einen Delegaten zwischenspeichern möchten (Leistungsverbesserung beim Aufruf der selbe Konstruktor viele Male), aber für den einmaligen Gebrauch wäre 'Activator' einfacher. –

+0

@Ben: Es hängt definitiv von Ihren Anforderungen ab, ja. –

Verwandte Themen