2012-10-17 14 views
5

Biorąc że mam typ „Wibble.Wobble”, który występuje w zespole „foo.bar” ​​istniejącej klasy/metody analizowania pełną nazwę Type

I że montaż nie jest ładowany do Główne zastosowania kontekst obciążenie

jest tam obecny mechanizm publicznego w celu analizowania następujący ciąg w jego kolejnych części:

"Wibble.Wobble, Foo.Bar, Version=1.0.0.0, Culture=neutral, PublicKeyToken=xyz" 

powodem jest to, że z prośbą Potrzebuję załadować wiele typów w czasie wykonywania, z których niektóre mogą być w bieżącym kontekście obciążenia. Inne mogą wymagać załadowania z zewnętrznego zespołu.

Wiem, jak załadować typy z bieżącego kontekstu obciążenia Type.GetType("typename"), Wiem, jak załadować zespół i uzyskać typ z niego Assembly.LoadFile("xyz").GetType("abc"). Mam problemy z tym, że jeśli spróbujesz załadować typ z zestawu , nie powinien on być w pełni kwalifikowaną nazwą, gdzie możesz, gdy używasz Type.GetType.

Samo rozwiązanie nie powinno być aż tak skomplikowane, wystarczy podzielić ciąg przed pierwszym przecinkiem. Jednak chciałem się dowiedzieć, czy istnieje sposób uzyskania w pełni kwalifikowanej nazwy jako reprezentacji obiektu, więc nie musiałem tego robić i pomogłoby to w zlokalizowaniu właściwego zespołu bez konieczności przechodzenia przez cały katalog.

Odpowiedz

1

Po tym wszystkim, że nie wiem, czy w Ramach jest coś publicznie dostępnego, można to zrobić. Chciałbym, aby ktoś pokazał mi coś innego, ponieważ wolę korzystać z podstawowej funkcjonalności, która jest (lub powinna być) lepiej przetestowana i napisana przez kogoś, kto lepiej rozumie ten framework niż ja.

Jako taki przeturlałem swój własny obiekt o silnym typie TypeName.

class TypeName 
{ 
    public TypeName(string name) 
    { 
     var index = name.LastIndexOf(','); 
     if (index > 0) 
     { 
      Name = name.Substring(0, index).Trim(); 

      AssemblyName = new AssemblyName(name.Substring(index + 1).Trim()); 
     } 
     else 
     { 
      Name = name;  
     } 
    } 

    public string Name { get; private set; } 

    public AssemblyName AssemblyName { get; private set; } 
} 

Obiekt zajmuje w string która powinna być nazwa typu lub w pełni kwalifikowana nazwa typu. Jeśli jest to w pełni kwalifikowana nazwa typu, to atrybut AssemblyName jest ustawiony przy użyciu klasy AssemblyName, w przeciwnym razie pozostanie jako null.

+1

indexof daje pierwsze wystąpienie przecinka, który może być użyty jako separator w ogólnych argumentach. To nie byłoby ładne –

+0

@DavidSchmitt Fair point, nie miałem jeszcze do czynienia z tym scenariuszem, ale zaktualizowałem przykład użycia LastIndexOf zamiast IndexOf. Dzięki za wskazówkę. – Bronumski

+1

Z LastIndexOf, może po prostu nigdy nie zadziałać, rozważ System.String, mscorlib, wersja = 4.0.0.0, Culture = neutralny, PublicKeyToken = b77a5c561934e089 ostatni indeks woluminu po prostu dostanie część PublicKeyToken – Alex

Powiązane problemy