각카
957
2020-07-09 16:36:56
9
413

c# 추상 클래스 메소드 호출 질문드립니다


c# 에서  추상 클래스에 동작하는 메소드를 다른 클래스에서 호출이 가능한가요?

예를 들어 public abstract class abstractTest: interfaceTest 에 있는 protected void methodTest() 를

다른 public class ServertTest : HttpServerTest 에서 호출하려하는데 안되서요

ServertTest에서 protected interfaceTest interfaceTest ; 선언하고 methodTest()를 호출하는데 null로 나와서 질문드립니다


0
  • 답변 9

  • byungil
    2020-07-09 16:46:20 작성 2020-07-09 16:49:01 수정됨
  • 각카
    957
    2020-07-09 17:04:53

    Type myAbstractGenericType = typeof(abstractTest);

    MethodInfo m = myAbstractGenericType.GetMethod("methodTest", BindingFlags.NonPublic | BindingFlags.Instance);

    이런식으로 사용하면 되는건가요?

  • byungil
    2020-07-09 17:08:23

    네 그런식입니다. 메서드 정보를 가져온다음 인보크 시키면됩니다.

  • 각카
    957
    2020-07-09 17:14:35 작성 2020-07-09 17:14:52 수정됨

    답변 감사합니다 마지막으로 질문하나만 드리겠습니다


     dynamic jObject = Newtonsoft.Json.Linq.JObject.Parse(jsonBody);

     Type myAbstractGenericType = typeof(abstractTest);

     MethodInfo test = myAbstractGenericType.GetMethod("methodTest", BindingFlags.NonPublic | BindingFlags.Instance);

    test.Invoke(); 여기서  methodTest 호출할때  jObject 와 넣어서 호출하고 싶은데 Invoke에서 따로 넣어야 하는게 있나요?


  • byungil
    2020-07-09 17:22:51 작성 2020-07-09 17:24:53 수정됨
  • 각카
    957
    2020-07-09 17:33:44

    dynamic jObject = Newtonsoft.Json.Linq.JObject.Parse(jsonBody);

     Type myAbstractGenericType = typeof(abstractTest);

     MethodInfo test = myAbstractGenericType.GetMethod("methodTest", BindingFlags.NonPublic | BindingFlags.Instance);

    test.Invoke(jObject, null); 

    코드를 작성했는데 메소드 호출이 안되네요 ㅠㅠ

    test 가 null로 나오고 있네요

  • PublixJava
    31
    2020-07-09 17:43:47

    1. 선언을 했더라도 인스턴스가 없으니 당연히 null입니다.

    2. protected method는 외부에서 부를 수 없는 method입니다.


    글을 적으신 분이 하고 싶으신게 뭔지 저는 잘 모르겠네요.

  • PublixJava
    31
    2020-07-09 17:49:36

    그리고 JObject형식으로는 원하시는 메소드를 부를 수 없습니다.

    Deserialize해서 클래스를 변경하셔야 할 것 같네요.

  • byungil
    2020-07-10 07:56:04 작성 2020-07-10 17:08:58 수정됨


    class Program
    {
        static void Main(string[] args)
        {
            var x = new ConcreteClass();
    
            string js = JsonConvert.SerializeObject(x);
    
    
            var test = JsonConvert.DeserializeObject<ConcreteClass>(js);
    
            var type = typeof(ConcreteClass);
    
            var method = type.GetMethod("Print", BindingFlags.NonPublic | BindingFlags.Instance);
    
            method.Invoke(test, new[] { "Hello World" });
        }
    }
    
    public abstract class AbstractClalss
    {
        protected void Print(string text)
        {
            Console.WriteLine(text);
        }
    }
    
    public class ConcreteClass : AbstractClalss
    {
    
    }


  • 로그인을 하시면 답변을 등록할 수 있습니다.