【问题标题】:Set the type of Generic (<T>) from the property从属性中设置 Generic (<T>) 的类型
【发布时间】:2015-03-10 06:43:30
【问题描述】:

我想实现如下

// Property
public static T Type
{ get; set; }

private void Form1_Load(...)
{
    List<Type> abc = new ...
    // code.....

如上所述,当我加载Form1 时,必须定义类型为Type (the property)List。我怎样才能做到这一点?

【问题讨论】:

  • 使用通用方法创建您的列表
  • 什么是T?包含代码的类的泛型参数?
  • 假设两个班级。从MainForm中,我选择Class1,然后在Form1中,abc的类型必须是Class1。即List&lt;Class1&gt; abc = new ...
  • 您不能使用属性的 content 来设置/派生列表的类型。您可以使用属性的 Type,因此具有泛型类型的属性必须在泛型类中。
  • 那么如何在没有属性的情况下实现这一点。

标签: c# .net generics properties


【解决方案1】:

Type 是属性名称,T 是类型名称。

List<T> abc = new List<T>();

我当然假设您已将封闭类参数化为class CustomForm&lt;T&gt;

【讨论】:

    【解决方案2】:

    不确定您为什么要使用属性来设置它,或者是否有可能 - 您是否希望能够在实例化后更改类型或其他什么?

    如果你没有一些非常特殊的需求,也许你可以用这个?:

    private void Form1_Load<T>(...)  // Pass the type in here
    {
        List<T> abc = new List<T>(); 
    }
    

    用法:

    this.Form1_Load<targetType>(...); 
    

    或者,在实例化包含 Form1_Load() 的类时传入类型:

    class Container<T>
    {
        private void Form1_Load(...)
        {
            List<T> abc = new List<T>(); 
        }
    }
    

    用法:

    var instance = new Container<targetType>(); 
    

    【讨论】:

    • 我正在使用对象作为数据源制作报告。 mindstick.com/Articles/13169999-ef3b-496c-b502-caef973c3bb2/… 现在我想做的是,以一种形式加载所有报告,在我的示例中为 Form1。正如您在链接中的 Form1_Load 事件中看到的那样,Student 类被设置为List&lt;&gt; 的类型。现在假设有另一个教师详细信息报告,我想以相同的形式加载它。我将为Teachers Details 创建另一个类并将其加载到Form1
    【解决方案3】:

    你可以像这样创建一个类构建器:

    public class GenericBuilder
    {
        public Type ParamType { get; set; }
    
        public object CreateList() {
            var listType = typeof(List<>);
    
            ArrayList alist = new ArrayList();
            alist.Add( this.ParamType );
    
            var targetType = listType.MakeGenericType( (Type[])alist.ToArray(typeof(Type)) );
    
            return Activator.CreateInstance( targetType );
        }
    }
    

    然后你就可以使用它了:

    var builder = new GenericBuilder();
    
    builder.ParamType = typeof( int );
    
    var result = builder.CreateList();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-16
      • 1970-01-01
      • 2021-05-05
      • 1970-01-01
      • 2011-02-08
      相关资源
      最近更新 更多