如何传递T类型值

时间:2013-11-29 05:35:30

标签: c# .net wpf wpf-4.0

我对这三个课程有疑问。

在第一堂课中,我为普通方法

扩展了listview类

在第二课中,我们将第一类调用一个方法

这适用于上述两个类,但在我的第三个类需要传递T,M值。 但我不明白该怎么做?

有人帮助解决这个问题吗?

谢谢

第一类

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 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 partial class SubASettings : UserControl
{
     public SubASettings()
    {
        InitializeComponent();
        MAILV.uc = this;
        MAILV.MyLEvnt = new MyLEvent<typeof(InvMail), MailManager>();
        Clear();
    }
}

谢谢,

3 个答案:

答案 0 :(得分: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();
    }
}

答案 1 :(得分:1)

宣言:

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

...定义泛型类型,用于在提供相应的类型参数时创建具体类型。您不能直接使用泛型类型,只能使用它们来创建随后可以使用的具体类型。

例如,List<T>泛型类型定义了可用于根据您使用的类型参数创建各种具体类型的结构和代码。 List<string>是从List<T>泛型类型创建的具体类型。

如果您的MyLEvent通用,则有两种类型参数:TM。您需要指定这两者以创建可以使用的具体类型。

MyListView课程中,您可以像这样定义MyLEvnt字段:

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

这将MyLEvnt字段定义为具体类型MyLEvent<Type, Type>的实例。请注意,Type是一个用于访问类型信息的类。在这种用法中,是一种避免提供类型参数的方法, 是一个类型参数。

在你的第三堂课中,你可以这样做:

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

即使我们从中取出typeof(),也会失败,因为您尝试将MyLEvent<InvMail, MailManager>的实例分配给MyLEvent<Type, Type>类型的字段。这些是不同的类型,正如List<string>List<int>不同。

您需要阅读Generics上的MSDN文章。这些解释了泛型如何工作的细节,并为您提供了很多如何使用它们的示例以及原因。

答案 2 :(得分:0)

非常感谢您的支持。我得到了一个解决方案......

这是我之前的第一堂课

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');
            }
        }
    }
}

这个解决方案对我来说更好。但如果这有任何错误 请让我指导

再次感谢你......