2016-04-27 8 views
0

Normalerweise mache ich das:generische Methoden mit benutzerdefinierten Objekte aus der Liste aufrufen (automatisieren)

MyCustomDocument1 bla1=new MyCustomDocument1() 
temp.GeneratesSingleDocument<MyCustomDocument1>(bla1); 

MyCustomDocument2 bla2=new MyCustomDocument2() 
temp.GeneratesSingleDocument<MyCustomDocument2>(bla2); 

MyCustomDocument3 bla3=new MyCustomDocument3() 
temp.GeneratesSingleDocument<MyCustomDocument3>(bla3); 

Aber dieses Mal habe ich eine Liste haben (mit allen Klassen von oben):

List<object> allObjects = new List<object>();

Es ist wie diese gefüllt (alle Objekte ich brauche):

allObjects.Add(new MyCustomDocument1()); 
allObjects.Add(new MyCustomDocument2()); 
allObjects.Add(new MyCustomDocument3()); 
allObjects.Add(new MyCustomDocument4()); 
allObjects.Add(new ...()); 

Jetzt möchte ich meine ge rufen rischen Methode mit meiner vorherigen gefüllt Liste ``:

foreach (var item in allObjects) 
{ 
    try 
    { 
     //instead of manually calling: 
     //temp.GeneratesSingleDocument<MyCustomDocument1>(bla1); 
     //do it generic 
     temp.GeneratesSingleDocument<typeof(item)>(item); 

    } 
    catch (Exception e) 
    { 

     Debug.WriteLine(e.Message); 
    } 

} 

Das funktioniert nicht:

temp.GeneratesSingleDocument<typeof(item)>(item); 

Das übergeordnete Ziel ist es, einige Automatisierung zu machen, sonst muss ich eine Menge Code schreiben.

Ich denke, das ist anders als this Post.

Vielen Dank.

+0

Vererbung und Polymorphie würden hier gut gehen. – Master

+1

Wie sieht 'GenerateSingleDocument' aus? Warum ist es überhaupt generisch, wenn du irgendein altes Objekt hineinlassen kannst? Offenbar müssen Sie eine Schnittstelle definieren, die für alle Klassen einheitlich ist, und GenerateSingleDocument muss diese Schnittstelle akzeptieren. –

+0

@Ian Mercer Sie haben Recht, ich kann jedes Objekt davon (aber 'GeneratesSingleDocument' wird nur einige von ihnen passen, innerhalb dieser Methode gibt es einen wswitch Fall für seinen Typ und als seine Arbeit), tatsächlich' GeneratesSingleDocument 'es ist eine Schnittstelle Methode :). Aber ich möchte Dokumente für bestimmte Klassen zu generieren, ist es nur zum Testen. – kkkk00999

Antwort

1

Sie können Reflexion verwenden. Versuchen Sie folgendes:

var genericMethod = temp.GetType().GetMethod("GeneratesSingleDocument").MakeGenericMethod(typeof(item)); 
genericMethod.Invoke(temp, new object[] { item }); 

sein, dass Reflexion bewusst kommt mit Leistung und Code Wartung issues-- here's a good link für Sie zu lesen. Viel Glück.

Verwandte Themen