2012-08-16 3 views
9

이들은 다음과 같은 질문입니다. How-to: Load a type from a referenced assembly at runtime using a string in Silverlight, GetType on a class in a referenced assembly fails하지만 둘 다 대답하지 않습니다.클래스 이름을 string으로 제공하여 참조 된 어셈블리에서 유형을 가져 옵니까?

일반 유형을 문자열로 포함하는 데이터베이스에서 데이터를 가져 오는 MVC 프로젝트가 있습니다. 이러한 유형은 MVC 프로젝트가 아닌 참조 된 어셈블리에 있습니다.

그래서 예를 들면의 내 참조 된 어셈블리 이름이 MyFramework하고 일반 유형 이름 Car이 전체 유형 이름은 MyFramework.Cars.Car 또는 MyFramework.Vehicles.Cars.Car 또는 다른 변화 될 수있다 가정 해 봅시다. 내가 가진 모든 참조 된 어셈블리 이름 및 일반 클래스 이름을 문자열로 있습니다. 전체 형식 이름에 관계없이 형식을 얻으려면 어떻게해야합니까?

마지막으로 GetType()을 호출하고 MvC 프로젝트에서이 함수를 사용하여 어셈블리 이름을 포함시킬 수있는 함수를 작성할 수 있습니까? 그래서 나는 내가 좋아하는 참조 된 어셈블리의 백분율을 쓸 수 있다고 생각 어셈블리 이름을 아는 제거 할 :

namespace MyFramework //the referenced assembly 
{ 
    public static class TypeUtil 
    { 
    public static Type GetFrameworkType(string typeName) 
    { 
     return Type.GetType(typeName); 
    } 
    } 
} 

그리고 내 MVC 프로젝트에서 내가 문자열 이름으로 어셈블리를 필요로하지 않고 호출 할 수 있습니다. 그게 가능할까요, 아니면 항상 어셈블리 이름이 필요할까요?

+0

다른 답변이 작동하지 않는 이유는 무엇입니까? –

+0

@RobertHarvey 그저 평범한 클래스 이름을 가지고 있기 때문입니다. 전체 형식 이름이 아닙니다. 이러한 답변은 전체 유형을 아는 데 의존합니다. – SventoryMang

답변

19

아마 참조 된 어셈블리가로드되지 않았을 수 있습니다. 또한 귀하의 질문에 전체 유형 이름이없고 클래스 이름 만 가지고 있다는 것을 이해합니다.
는 그런 다음이 라인을 따라 뭔가를 시도해야합니다 :

Type type = Assembly.Load("YourAssemblyName").GetTypes().First(t => t.Name == "ShortTypeName"); 

희망 내가 제대로 이해.

+0

그 어셈블리에 Util을 작성했지만 클래스 이름 만 가지고 있다면 어떻게 보일까요? 'GetTypeFromFramework (string typeName) '함수를 가질 수있는'TypeUtil' 클래스를 작성하여 어셈블리 이름의 필요성을 제거하고 싶습니다. 그 어셈블리에서'GetType'을 호출하면 어셈블리를 전혀 사용할 필요가 없지만 여전히 null을 반환한다고 생각했습니다. – SventoryMang

+0

귀하의 상황을 더 잘 이해할 수 있도록 귀하가하려는 일의 샘플을 게시하십시오. –

+0

질문을 편집했습니다. 귀하의 답변은 나의 Util에서 사용할 때 작동합니다. 어셈블리 이름에 대한 종속성을 문자열로 제거 할 수 있는지 궁금합니다. 나는이 어셈블리에서 GetType()을 호출하면 어셈블리 이름을 제공 할 필요가 없지만이 코드가 어셈블리에있을 때라도 null을 반환하는'Type.GetType (클래스 이름) '을 단순히 제공한다는 인상하에있었습니다. 참조 된 어셈블리. – SventoryMang

9

첫 번째 질문의 경우, 내가 두 번째 질문이 무슨 뜻인지 잘 모르겠습니다

Type t = AppDomain.CurrentDomain.GetAssemblies() 
           .Where(a => a.FullName == "MyFramework") 
           .SelectMany(a => a.GetTypes()) 
           .Where(t => t.Name == "Car") 
           .FirstOrDefault(); 

뭔가를 할 수 있습니다.