首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在C#中,如何在方法中实例化传递的泛型类型?

在C#中,如何在方法中实例化传递的泛型类型?
EN

Stack Overflow用户
提问于 2009-03-18 16:13:08
回答 8查看 65.6K关注 0票数 109

如何在下面的InstantiateType<T>方法中实例化类型T?

我得到了一个错误:'T‘是一个’类型参数‘,但被用作’variable‘。

(向下滚动查看REFACTORED答案)

代码语言:javascript
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace TestGeneric33
{
    class Program
    {
        static void Main(string[] args)
        {
            Container container = new Container();
            Console.WriteLine(container.InstantiateType<Customer>("Jim", "Smith"));
            Console.WriteLine(container.InstantiateType<Employee>("Joe", "Thompson"));
            Console.ReadLine();
        }
    }

    public class Container
    {
        public T InstantiateType<T>(string firstName, string lastName) where T : IPerson
        {
            T obj = T();
            obj.FirstName(firstName);
            obj.LastName(lastName);
            return obj;
        }

    }

    public interface IPerson
    {
        string FirstName { get; set; }
        string LastName { get; set; }
    }

    public class Customer : IPerson
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Company { get; set; }
    }

    public class Employee : IPerson
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public int EmployeeNumber { get; set; }
    }
}

REFACTORED答案:

感谢所有的评论,他们让我走上了正确的道路,这是我想要做的:

代码语言:javascript
复制
using System;

namespace TestGeneric33
{
    class Program
    {
        static void Main(string[] args)
        {
            Container container = new Container();
            Customer customer1 = container.InstantiateType<Customer>("Jim", "Smith");
            Employee employee1 = container.InstantiateType<Employee>("Joe", "Thompson");
            Console.WriteLine(PersonDisplayer.SimpleDisplay(customer1));
            Console.WriteLine(PersonDisplayer.SimpleDisplay(employee1));
            Console.ReadLine();
        }
    }

    public class Container
    {
        public T InstantiateType<T>(string firstName, string lastName) where T : IPerson, new()
        {
            T obj = new T();
            obj.FirstName = firstName;
            obj.LastName = lastName;
            return obj;
        }
    }

    public interface IPerson
    {
        string FirstName { get; set; }
        string LastName { get; set; }
    }

    public class PersonDisplayer
    {
        private IPerson _person;

        public PersonDisplayer(IPerson person)
        {
            _person = person;
        }

        public string SimpleDisplay()
        {
            return String.Format("{1}, {0}", _person.FirstName, _person.LastName);
        }

        public static string SimpleDisplay(IPerson person)
        {
            PersonDisplayer personDisplayer = new PersonDisplayer(person);
            return personDisplayer.SimpleDisplay();
        }
    }

    public class Customer : IPerson
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Company { get; set; }
    }

    public class Employee : IPerson
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public int EmployeeNumber { get; set; }
    }
}
EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2009-03-18 16:15:29

像这样声明你的方法:

代码语言:javascript
复制
public string InstantiateType<T>(string firstName, string lastName) 
              where T : IPerson, new()

请注意末尾的附加约束。然后在方法体中创建一个new实例:

代码语言:javascript
复制
T obj = new T();    
票数 149
EN

Stack Overflow用户

发布于 2009-03-18 16:18:39

有几种方法。

如果不指定类型,则必须具有构造函数:

代码语言:javascript
复制
T obj = default(T); //which will produce null for reference types

使用构造函数:

代码语言:javascript
复制
T obj = new T();

但这需要以下子句:

代码语言:javascript
复制
where T : new()
票数 33
EN

Stack Overflow用户

发布于 2009-03-18 16:25:36

为了扩展上面的答案,将where T:new()约束添加到泛型方法将要求T具有公共的、无参数的构造函数。

如果您想避免这种情况-在工厂模式中,有时会强制其他方法通过您的工厂方法,而不是直接通过构造函数-那么另一种选择是使用反射(Activator.CreateInstance...)并保持默认构造函数为私有。当然,这也会带来性能损失。

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/658951

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档