【问题标题】:How to Pass Generic T type values如何传递通用 T 类型值
【发布时间】:2013-11-29 05:35:30
【问题描述】:

我对这三个类有疑问。

在第一堂课中,我正在为常用方法的列表视图类进行扩展

在第二类中,我们放置一个由第一类调用的方法

这对以上两个类都很好,但在我的第三类中需要传递 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;
    }
}

三级

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

谢谢,

【问题讨论】:

  • MAILV.MyLEvnt = new MyLEvent();
  • 是的,我这样做了,但它的显示类型转换错误“不能隐式将 mailmanager 转换为 system.Type
  • 什么是MailManager
  • @Szymon 无关。他将他的领域声明为MyLEvent&lt;Type, Type&gt;,这是根本问题。
  • MailManager 是我的 Customer 类,如何定义 MLEvent 的 1 类属性来调用 2 类。我想通过第二类将任何自定义类类型传递给第三类

标签: c# .net wpf wpf-4.0


【解决方案1】:

您可以通过声明一个接口来为您的泛型类型添加一个约束:

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

【讨论】:

    【解决方案2】:

    声明:

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

    ...定义一个通用类型,当提供适当的类型参数时,该类型用于创建具体类型。你不能直接使用泛型类型,你只能使用它们来创建可以使用的具体类型。

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

    对于您的MyLEvent 泛型,有两个类型参数:TM。您需要同时指定这两者以创建可以使用的具体类型。

    在您的 MyListView 类中,您可以像这样定义 MyLEvnt 字段:

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

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

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

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

    即使我们从其中取出typeof(),这也会失败,因为您试图将MyLEvent&lt;InvMail, MailManager&gt; 的实例分配给MyLEvent&lt;Type, Type&gt; 类型的字段。这些是不同的类型,就像List&lt;string&gt;List&lt;int&gt; 不同。

    您需要阅读 Generics 上的 MSDN 文章。这些解释了泛型如何工作的详细信息,并为您提供了很多关于如何使用它们以及为什么使用它们的示例。

    【讨论】:

    • 谢谢。我找到了一种解决方案来解决我的问题。请看看并告诉我它是否会产生任何问题?
    【解决方案3】:

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

    这是我以前的第一堂课

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

    这个解决方案更适合我。但如果这有什么问题 请让我指导

    再次感谢...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-23
      • 2020-01-13
      • 1970-01-01
      • 2018-03-26
      • 1970-01-01
      • 2020-08-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多