제네릭 클래스의 제네릭 메서드에 동적 유형의 인스턴스 전달

Matthys Du Toit

제네릭 메서드를 노출하는 제네릭 클래스가 있습니다. 이 메서드는 일반 개체의 인스턴스를 매개 변수로 받고이 인스턴스를 수정합니다.

예제 클래스 :

public class GenericClass<T>
{
    public T GenericMethod(T obj)
    {
        // modify the object in some (arbitrary) way
        IEnumerable<FieldInfo> fields = obj.GetType().GetRuntimeFields();
        foreach (FieldInfo field in fields)
        {
            if (field.FieldType == typeof(string))
            {
                field.SetValue(obj, "This field's string value was modified");
            }
        }

        return obj;
    }
}

유형 (abc)이있는 경우 :

public class abc
{
    public string a;
    public string b;
    public int c;
}

이 메서드를 다음과 같이 호출 할 수 있습니다.

GenericClass<abc> myGeneric = new GenericClass<abc>();
var myObject = myGeneric.GenericMethod(new abc());

//Confirm success by printing one of the fields
Console.Writeline(((abc)myObject).a);

이제 내 실제 질문 :

위의 abc 유형과 달리 런타임에만 알려진 유형을 사용하여 동일한 Generic 메서드를 어떻게 호출 할 수 있습니까? 또한 위의 abc에서했던 것처럼 GenericMethod에 전달할 때 이것을 인스턴스화하고 싶습니다.

(나는 이것이 완전히 틀렸다는 것을 안다)

Type MyType;

GenericClass<MyType> myGeneric = new GenericClass<MyType>();
var myObject = myGeneric.GenericMethod(new MyType());

알 수없는 유형의 성공은 존재하지 않을 수있는 "a"필드를 인쇄하여 확인할 수 없기 때문에 모든 문자열 필드의 값을 인쇄 할 수 있지만 이것은 질문의 범위를 벗어납니다.

세바스찬 슈만

질문에 답하려면 :

var type = typeof(abc);
object instanceToModify = new abc();

var typeToCreate = typeof(GenericClass<>).MakeGenericType(type);
var methodToCall = typeToCreate.GetMethod("GenericMethod");

var genericClassInstance = Activator.CreateInstance(typeToCreate);
methodToCall.Invoke(genericClassInstance, new[] { instanceToModify });

데모

그러나:

유형이 런타임에만 알려진 경우 인스턴스는 object또는로 선언 된 변수에서 처리되어야합니다 dynamic. 이 경우 메서드 서명을 다음과 같이 변경할 수 있습니다.

public object GenericMethod(object obj)
{
    // modify the object in some (arbitrary) way
    IEnumerable<FieldInfo> fields = obj.GetType().GetRuntimeFields();
    foreach (var field in fields)
    {
        if (field.FieldType == typeof(string))
        {
            field.SetValue(obj, "This field's string value was modified");
        }
    }

    return obj;
}

일반 클래스 / 메소드가 필요하지 않습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

C ++ : 제네릭 클래스의 비 제네릭 메서드?

분류에서Dev

C ++ : 제네릭 클래스의 비 제네릭 메서드?

분류에서Dev

비 제네릭 클래스의 제네릭 메서드

분류에서Dev

Swift에서 제네릭 유형의 구체적인 인스턴스 확장

분류에서Dev

구체적인 클래스를 스칼라의 제네릭 메서드 인스턴스화

분류에서Dev

제네릭 유형 인스턴스를 가져 오지 않는 제네릭 메서드 내에서 구체적인 클래스 속성 읽기

분류에서Dev

제네릭 반환 유형을 사용하여 메서드에서 구체적인 클래스의 인스턴스를 반환하는 방법

분류에서Dev

비 제네릭 클래스의 제네릭 클래스 메서드

분류에서Dev

정적 메서드에서 실제 제네릭 유형의 클래스 개체 가져 오기

분류에서Dev

정적 메서드에서 실제 제네릭 유형의 클래스 개체 가져 오기

분류에서Dev

정적 비 제네릭 클래스 내의 제네릭 함수?

분류에서Dev

제네릭 클래스의 사전

분류에서Dev

클래스의 다른 제네릭 유형의 인스턴스를 반환하는 단일 메서드

분류에서Dev

제네릭 클래스의 정적 Create () 메서드에 대한 압축 구문?

분류에서Dev

제네릭 유형의 제네릭 클래스에서 유형 인수에 액세스

분류에서Dev

제네릭 클래스 유형 제약이있는 제네릭 메서드

분류에서Dev

AutoMoq에서 제네릭 클래스의 속성을 매개 변수로 전달

분류에서Dev

C #의 제네릭 클래스가있는 제네릭 메서드

분류에서Dev

제네릭 클래스의 유형별 정적 상태

분류에서Dev

제네릭 유형이 1 개인 클래스에서 제네릭 유형이 2 개인 메서드

분류에서Dev

하나의 클래스에서만 제네릭 유형 설정

분류에서Dev

Swift : 제네릭 클래스의 제네릭 유형 비교

분류에서Dev

나중에 Java의 코드에서 인스턴스 제네릭 유형 정의

분류에서Dev

제네릭 클래스의 암시 적 형식 인수

분류에서Dev

제네릭 클래스에서 Java 제네릭 클래스 인스턴스화

분류에서Dev

객체가 제네릭 기본 클래스의 인스턴스인지, 제네릭 유형인지 확인

분류에서Dev

제네릭 유형 인스턴스화

분류에서Dev

변수에서 제네릭 유형 인스턴스화

분류에서Dev

제네릭이 아닌 정적 클래스의 제네릭 오버로드 된 메서드에서 RuntimeMethodInfo 가져 오기

Related 관련 기사

  1. 1

    C ++ : 제네릭 클래스의 비 제네릭 메서드?

  2. 2

    C ++ : 제네릭 클래스의 비 제네릭 메서드?

  3. 3

    비 제네릭 클래스의 제네릭 메서드

  4. 4

    Swift에서 제네릭 유형의 구체적인 인스턴스 확장

  5. 5

    구체적인 클래스를 스칼라의 제네릭 메서드 인스턴스화

  6. 6

    제네릭 유형 인스턴스를 가져 오지 않는 제네릭 메서드 내에서 구체적인 클래스 속성 읽기

  7. 7

    제네릭 반환 유형을 사용하여 메서드에서 구체적인 클래스의 인스턴스를 반환하는 방법

  8. 8

    비 제네릭 클래스의 제네릭 클래스 메서드

  9. 9

    정적 메서드에서 실제 제네릭 유형의 클래스 개체 가져 오기

  10. 10

    정적 메서드에서 실제 제네릭 유형의 클래스 개체 가져 오기

  11. 11

    정적 비 제네릭 클래스 내의 제네릭 함수?

  12. 12

    제네릭 클래스의 사전

  13. 13

    클래스의 다른 제네릭 유형의 인스턴스를 반환하는 단일 메서드

  14. 14

    제네릭 클래스의 정적 Create () 메서드에 대한 압축 구문?

  15. 15

    제네릭 유형의 제네릭 클래스에서 유형 인수에 액세스

  16. 16

    제네릭 클래스 유형 제약이있는 제네릭 메서드

  17. 17

    AutoMoq에서 제네릭 클래스의 속성을 매개 변수로 전달

  18. 18

    C #의 제네릭 클래스가있는 제네릭 메서드

  19. 19

    제네릭 클래스의 유형별 정적 상태

  20. 20

    제네릭 유형이 1 개인 클래스에서 제네릭 유형이 2 개인 메서드

  21. 21

    하나의 클래스에서만 제네릭 유형 설정

  22. 22

    Swift : 제네릭 클래스의 제네릭 유형 비교

  23. 23

    나중에 Java의 코드에서 인스턴스 제네릭 유형 정의

  24. 24

    제네릭 클래스의 암시 적 형식 인수

  25. 25

    제네릭 클래스에서 Java 제네릭 클래스 인스턴스화

  26. 26

    객체가 제네릭 기본 클래스의 인스턴스인지, 제네릭 유형인지 확인

  27. 27

    제네릭 유형 인스턴스화

  28. 28

    변수에서 제네릭 유형 인스턴스화

  29. 29

    제네릭이 아닌 정적 클래스의 제네릭 오버로드 된 메서드에서 RuntimeMethodInfo 가져 오기

뜨겁다태그

보관