2013-11-29 2 views
1

이 세 클래스에 문제가 있습니다. 첫 번째 클래스에서T 타입 값을 전달하는 방법

내가 두 번째 클래스에서 일반적인 방법

에 대한 목록보기 클래스 확장하고있어 우리는

이 두 클래스 이상하지만 세 번째 클래스 괜찮는 1 등석에 의해 호출있어 하나의 방법을 넣어 T, M 값을 통과해야합니다. 하지만이 작업을 수행하는 방법을 이해하지 못합니까?

아무도이 문제에 도움이 되셨습니까?

1 급

public class MyListView : ListView 
{ 
    public UserControl uc { get; set; } 
    internal MyLEvent<Type,Type> MyLEvnt { get; set; } 
    public MyListView() 
    { 
     PreviewKeyDown += new KeyEventHandler(MyListView_PreviewKeyDown); 
    } 
    private void MyListView_PreviewKeyDown(object sender,KeyEventArgs e) 
    { 
     ListView view = sender as ListView; 
     var item = view.SelectedItem; 
     if (item != null) 
     { 
      string str = item.GetType().Name; 
      if (e.Key == Key.Delete) 
      { 
       MyLEvnt.Method(item, "Delete"); 
      } 
      else if (e.Key == Key.Enter) 
      { 
       MyLEvnt.Method(item, "Modify"); 
       uc.GetType().GetProperty("Update").SetValue(uc, 1, null); 
       MethodInfo mi = uc.GetType().GetMethod("IClear"); 
       mi.Invoke(uc, null); 
      } 
     } 
    } 
} 

2 급

public class MyLEvent<T,M> where T : class where M : class 
{ 
    private M manager; 
    private T type; 
    public MyLEvent() 
    { 

    } 
    public object Method(object _view, string flog) 
    { 
     object retVal = null; 
     type = Activator.CreateInstance<T>(); 
     manager = Activator.CreateInstance<M>(); 
     if (flog == "Modify") 
     { 
      MethodInfo method = typeof(M).GetMethod("getData"); 
      type = (T)method.Invoke(manager, new[] { _view }); 

     } 
     else if (flog == "Set") 
     { 
      MethodInfo method = typeof(M).GetMethod("setDefault"); 
      retVal = method.Invoke(manager, new[] { _view }); 
     } 
     else 
     { 
      if (MyMessage.askDelete() == true) 
      { 
       PropertyClass.Properties(_view, type, 'U'); 
       MethodInfo method = typeof(M).GetMethod("Delete"); 
       retVal = method.Invoke(manager, new[] { type }); 
      } 
     } 
     return retVal; 
    } 
} 

3 급

주셔서 감사합니다

public class MyLEvent<T,M> where T : class where M : class 
{ 
... 
} 

이 ... 적절한 유형의 매개 변수를 제공 할 때 구체적인 유형를 만드는 데 사용되는 제네릭 형식을 정의

+0

MAILV.MyLEvnt = 새로운 MyLEvent (); –

+0

예,하지만 그 쇼 형식 변환 오류 "mailmanager를 system.Type으로 변환 할 수 없습니다. –

+0

MailManager는 무엇입니까? – Szymon

답변

2

:

:

public interface IManager 
{ 
    void getData(); 
    setDefault 
    Delete 
} 

M 유형 IManager 인터페이스를 구현해야한다는 것을 의미 번째 클래스의 선언이 제약 조건을 정의를

public class MyLEvent<T, M> 
    where T : class 
    where M : class, IManager 

그런 다음 인터페이스에 정의 된 클래스 멤버를 호출 할 수 있습니다.

public class MyLEvent<T, M> 
    where T : class 
    where M : class, IManager 
{ 
    private M manager; 

    public MyLEvent() 
    { 
     manager.Delete(); 
    } 
} 
+0

대단히 고마워요. –

1

, 선언을 주셔서 감사합니다. 제네릭 형식은 직접 사용할 수 없으며이 형식을 사용하여 사용할 수있는 구체적인 형식을 만들 수만 있습니다.

예를 들어, List<T> 제네릭 형식은 사용하는 형식 매개 변수에 따라 다양한 구체적인 형식을 만드는 데 사용할 수있는 구조 및 코드를 정의합니다. List<string>List<T> 제네릭 유형에서 작성된 콘크리트 유형입니다.

MyLEvent 제네릭의 경우 두 가지 유형 매개 변수 인 TM이 있습니다. 사용할 수있는 구체화 된 유형을 작성하려면이 두 가지를 모두 지정해야합니다. 당신의 MyListView 클래스에서

는이 같은 MyLEvnt 필드를 정의 :

internal MyLEvent<Type,Type> MyLEvnt { get; set; } 

이것은 콘크리트 유형 MyLEvent<Type, Type>의 인스턴스로 MyLEvnt 필드를 정의합니다. Type은 형식에 대한 정보에 액세스하는 데 사용되는 클래스입니다. 이 용도에서는 이 아니며 형식 매개 변수를 제공하지 않으려면 이 형식 매개 변수입니다.세 번째 클래스에서

당신은이 작업을 수행 : 당신이 유형 MyLEvent<Type, Type>의 필드에 MyLEvent<InvMail, MailManager>의 인스턴스를 할당하려고하기 때문에

MAILV.MyLEvnt = new MyLEvent<typeof(InvMail), MailManager>(); 

우리가 그것을 밖으로 typeof()을 경우에도이 실패합니다. 이들은 List<string>List<int>과 다른 다른 유형입니다.

Generics에 대한 MSDN 기사를 읽어야합니다. 여기서는 제네릭의 작동 방식에 대한 세부 사항을 설명하고 사용법 및 이유에 대한 많은 예제를 제공합니다.

당신은 인터페이스 선언하여 제네릭 형식에 제약 조건을 추가 할 수 있습니다
+0

감사합니다. 한 가지 해결책으로 문제를 해결할 수있었습니다. . 제발 그게 어떤 문제를 만들었는지보고 말해 주시겠습니까? –

0

지원해 주셔서 감사합니다. 그리고 난이 내 이전 1 등석

public class MyListView : ListView 
{ 
    public UserControl uc { get; set; } 
    internal MyLEvent<Type,Type> MyLEvnt { get; set; } 
    public MyListView() 
    { 
    PreviewKeyDown += new KeyEventHandler(MyListView_PreviewKeyDown); 
    } 
    private void MyListView_PreviewKeyDown(object sender,KeyEventArgs e) 
    { 
    ListView view = sender as ListView; 
    var item = view.SelectedItem; 
    if (item != null) 
    { 
     string str = item.GetType().Name; 
     if (e.Key == Key.Delete) 
     { 
      MyLEvnt.Method(item, "Delete"); 
     } 
     else if (e.Key == Key.Enter) 
     { 
      MyLEvnt.Method(item, "Modify"); 
      uc.GetType().GetProperty("Update").SetValue(uc, 1, null); 
      MethodInfo mi = uc.GetType().GetMethod("IClear"); 
      mi.Invoke(uc, null); 
     } 
    } 
} 

} 내 수준에서 수정 후

입니다

이것에 대한 하나 개의 솔루션을 .... .... 가지고

public class MyListView : ListView 
{ 
    public UserControl uc { get; set; } 
    public object ML { get; set; } 
    public MyListView() 
    { 
     PreviewKeyDown += new KeyEventHandler(MyListView_PreviewKeyDown); 
    } 
    public void Methode<T,M>() where T : class where M : class 
    { 
     ListViewEvents<T, M> mn = new ListViewEvents<T, M>(); 
     ML = mn; 
    } 
    private void MyListView_PreviewKeyDown(object sender,KeyEventArgs e) 
    { 
     ListView view = sender as ListView; 
     var item = view.SelectedItem; 
     if (item != null) 
     { 
      string str = item.GetType().Name; 
      if (e.Key == Key.Delete) 
      { 
       MethodInfo mi = ML.GetType().GetMethod("Method"); 
       mi.Invoke(ML,new[]{item,"Delete"}); 
       MethodInfo m = uc.GetType().GetMethod("IClear"); 
       m.Invoke(uc, null); 
      } 
      else if (e.Key == Key.Enter) 
      { 
       MethodInfo m = ML.GetType().GetMethod("Method"); 
       object ob = m.Invoke(ML, new[] { item, "Modify" }); 
       PropertyClass.Properties(uc, ob, 'U'); 
      } 
     } 
    } 
} 

이 솔루션은 나를 위해 더 잘 작동합니다. 그러나 경우는 ... 나를

이 다시 한번 감사드립니다 안내 주시기 바랍니다이 어떤 잘못이