>  기사  >  백엔드 개발  >  C#에서는 리플렉션을 사용하여 클래스 이름을 기반으로 클래스의 인스턴스 개체를 만듭니다.

C#에서는 리플렉션을 사용하여 클래스 이름을 기반으로 클래스의 인스턴스 개체를 만듭니다.

黄舟
黄舟원래의
2017-03-16 10:57:502732검색

이 글에서는 클래스 이름을 기반으로 클래스 객체의 인스턴스를 생성하기 위해 리플렉션을 사용하는 C#에 대한 자세한 설명을 주로 소개합니다. "Reflection"은 실제로 클래스의 메타데이터 정보를 사용합니다. 관심있는 친구들은 참고하시면 됩니다.

"Reflection"은 실제로 어셈블리의 메타데이터 정보를 사용합니다. Reflection에는 다양한 메서드가 있을 수 있습니다. 프로그램을 작성할 때 먼저 System.Reflection 네임스페이스 를 가져오세요.

1. DLL에 클래스를 반영하려고 하는데 해당 클래스에 대한 참조가 없다고 가정합니다(즉, 알 수 없는 유형).


Assembly assembly = Assembly.LoadFile("程序集路径,不能是相对路径"); // 加载程序集(EXE 或 DLL) 
dynamic obj = assembly.CreateInstance("类的完全限定名(即包括命名空间)"); // 创建类的实例

2. 해당 클래스를 현재 프로젝트에 반영하고 싶다면(즉, 현재 프로젝트에서 참조하고 있는), 다음과 같이 할 수 있습니다:


Assembly assembly = Assembly.GetExecutingAssembly(); // 获取当前程序集 
dynamic obj = assembly.CreateInstance("类的完全限定名(即包括命名空间)"); 
// 创建类的实例,返回为 object 类型,需要强制类型转换

3 다음과 같이 할 수도 있습니다:


Type type = Type.GetType("类的完全限定名"); 
dynamic obj = type.Assembly.CreateInstance(type);

4. 다른 어셈블리인 경우 호출을 로드하려면 코드는 다음과 같습니다.

System.Reflection.Assembly.Load("Assembly name (파일 접미사 이름 제외)").CreateInstance("Namespace.Class name" , false);

예:

코드는 다음과 같습니다.

dynamic o = System.Reflection.Assembly.Load("MyDll").CreateInstance("MyNameSpace.A", false);

참고: 동적을 사용해야 하기 때문에 컴파일 중에 오류가 발생하면 대상을 4.0으로 변경해야 합니다. 동적 표현식 을 컴파일하는 데 필요한 유형을 찾을 수 없습니다. 누락된 참조가 있습니까?", 예 누락된 참조가 있으므로 프로젝트에서 Miscorsoft.CSharp클래스 라이브러리를 참조하면 됩니다. 추가 후 성공적으로 컴파일됩니다.

======================================= ===== ==============

보충:

1) 리플렉션을 통해 클래스의 인스턴스를 생성하는 경우 , 정규화된 이름(네임스페이스 + 클래스 이름)을 사용해야 합니다. Type.GetType 메서드가 null을 반환하는 경우 메타데이터에서 관련 정보에 대한 검색이 실패했음을 의미합니다(반사 실패). 클래스의 정규화된 이름을 사용해야 합니다. 반성 중.

2) 반사 기능이 매우 강력해서 못할 것이 없습니다. "크로스 어셈블리"를 구현하려면 첫 번째 방법을 사용하여 클래스의 인스턴스를 만들고 필드, 속성, 메서드, 이벤트...를 반영하세요. 인스턴스를 생성한 다음 동적으로 호출합니다.


아아아아

위 내용은 C#에서는 리플렉션을 사용하여 클래스 이름을 기반으로 클래스의 인스턴스 개체를 만듭니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.