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

2023-11-29

我如何实例化我的类型 TInstantiateType<T>下面的方法?

我收到错误:“T”是“类型参数”,但使用方式类似于“变量”。:

(向下滚动查看重构答案)

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

重构的答案:

感谢所有的评论,他们让我走上了正轨,这就是我想做的:

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

像这样声明你的方法:

public string InstantiateType<T>(string firstName, string lastName) 
              where T : IPerson, new()

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

T obj = new T();    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 C# 中,如何实例化方法内传递的泛型类型? 的相关文章

  • 创建 DirectoryEntry 实例以供测试使用

    我正在尝试创建 DirectoryEntry 的实例 以便可以使用它来测试将传递 DirectoryEntry 的一些代码 然而 尽管进行了很多尝试 我还是找不到实例化 DE 并初始化它的 PropertyCollection 的方法 我有
  • 如何在 Unity 中从 RenderTexture 访问原始数据

    问题的简短版本 我正在尝试访问 Unity 中 RenderTexture 的内容 我一直在使用 Graphics Blit 使用自己的材质进行绘制 Graphics Blit null renderTexture material 我的材
  • Func 方法参数的首选命名约定是什么?

    我承认这个问题是主观的 但我对社区的观点感兴趣 我有一个缓存类 它采用类型的缓存加载器函数Func
  • 在 Xamarin Android 中将图像从 URL 异步加载到 ImageView 中

    我有一个包含多个项目的 ListView 列表中的每个项目都应该有一个与之关联的图像 我创建了一个数组适配器来保存每个列表项并具有我希望加载的图像的 url 我正在尝试使用 Web 请求异步加载图像 并设置图像并在加载后在视图中更新它 但视
  • SSH 主机密钥指纹与模式 C# WinSCP 不匹配

    我尝试通过 WinSCP 使用 C 连接到 FTPS 服务器 但收到此错误 SSH 主机密钥指纹 与模式不匹配 经过大量研究 我相信这与密钥的长度有关 当使用 服务器和协议信息 下的界面进行连接时 我从 WinSCP 获得的密钥是xx xx
  • C# 中值类型和引用类型有什么区别? [复制]

    这个问题在这里已经有答案了 我知道一些差异 值类型存储在堆栈上 而引用类型存储在托管堆上 值类型变量直接包含它们的值 而引用变量仅包含对托管堆上创建的对象位置的引用 我错过了任何其他区别吗 如果是的话 它们是什么 请阅读 堆栈是一个实现细节
  • 将字符串从非托管代码传递到托管

    我在将字符串从非托管代码传递到托管代码时遇到问题 在我的非托管类中 非托管类 cpp 我有一个来自托管代码的函数指针 TESTCALLBACK FUNCTION testCbFunc TESTCALLBACK FUNCTION 接受一个字符
  • 使用 C# 在 WinRT 中获取可用磁盘空间

    DllImport kernel32 dll SetLastError true static extern bool GetDiskFreeSpaceEx string lpDirectoryName out ulong lpFreeBy
  • 如何针对 Nancy 中的 Active Directory 进行身份验证?

    这是一篇过时的文章 但是http msdn microsoft com en us library ff650308 aspx paght000026 step3 http msdn microsoft com en us library
  • C# 用数组封送结构体

    假设我有一个类似于 public struct MyStruct public float a 我想用一些自定义数组大小实例化一个这样的结构 在本例中假设为 2 然后我将其封送到字节数组中 MyStruct s new MyStruct s
  • 线程、进程和 Application.Exit()

    我的应用程序由主消息循环 GUI 和线程 Task Factory 组成 在线程中我调用一些第三方应用程序var p new Process 但是当我调用Application Exit 在消息循环中 我可以看到在线程中启动的进程仍在内存中
  • 检查 url 是否指向文件或页面

    我们需要以下内容 如果文件确实是文件 则从 URL 下载该文件 否则 如果它是一个页面 则什么也不做 举个简单的例子 我有以下命令来下载文件 My Computer Network DownloadFile http www wired c
  • 什么是 C 语言的高效工作流程? - Makefile + bash脚本

    我正在开发我的第一个项目 该项目将跨越多个 C 文件 对于我的前几个练习程序 我只是在中编写了我的代码main c并使用编译gcc main c o main 当我学习时 这对我有用 现在 我正在独自开展一个更大的项目 我想继续自己进行编译
  • 方法参数内的变量赋值

    我刚刚发现 通过发现错误 你可以这样做 string s 3 int i int TryParse s hello out i returns false 使用赋值的返回值是否合法 Obviously i is but is this th
  • Bing 地图运行时错误 Windows 8.1

    当我运行带有 Bing Map 集成的 Windows 8 1 应用程序时 出现以下错误 Windows UI Xaml Markup XamlParseException 类型的异常 发生在 DistanceApp exe 中 但未在用户
  • 窗体最大化时自动缩放子控件

    有没有办法在最大化屏幕或更改分辨率时使 Windows 窗体上的所有内容自动缩放 我发现手动缩放它是正确的 但是当切换分辨率时我每次都必须更改它 this AutoScaleDimensions new System Drawing Siz
  • Java 推断泛型类型

    我正在寻找类似的推断捕获泛型类型的概念 类似于以下方法片段 但不是捕获泛型类型的类 public
  • 如何使用 ReactiveList 以便在添加新项目时更新 UI

    我正在创建一个带有列表的 Xamarin Forms 应用程序 itemSource 是一个reactiveList 但是 向列表添加新项目不会更新 UI 这样做的正确方法是什么 列表定义 listView new ListView var
  • 如何在 C# 中播放在线资源中的 .mp3 文件?

    我的问题与此非常相似question https stackoverflow com questions 7556672 mp3 play from stream on c sharp 我有音乐网址 网址如http site com aud
  • 如何将字符串“07:35”(HH:MM) 转换为 TimeSpan

    我想知道是否有办法将 24 小时时间格式的字符串转换为 TimeSpan 现在我有一种 旧时尚风格 string stringTime 07 35 string values stringTime Split TimeSpan ts new

随机推荐

  • 如何在Python中向输出文件添加新列?

    我用 Python 编写了这段代码 如何添加每行包含数字 1 的新列 qty 这是文件tripo 1 txt 2 txt 5 txt 4 txt 3 txt 6 txt 7 txt 8 txt 这是代码 with open test csv
  • SQL Getdate的精度?

    我正在试验一个程序 该程序可以高速将数据插入 SQL 2005 Server 数据库 在 XP SP3 上 这是为了收集时序数据 以便我可以评估设计的不同方面 我的基本设置包括将数据插入到如下表中 并使用仅指定有效负载字段的 SP crea
  • 错误:#1071 - 指定的密钥太长;最大密钥长度为 1000 字节 - mysql 5.0.91

    我使用的是 mysql 5 0 91 我需要保存 URL 有些很小 有些很长 我想用varchar 2000 但我收到错误 1071 指定的密钥太长 最大密钥长度为 1000 字节 使用 mysql 5 0 91 在我的主机上保存 URL
  • 在 Apache 的 Lucene 中使用默认和自定义停用词(奇怪的输出)

    我正在使用 Apache 的从字符串中删除停用词Lucene 8 6 3 和以下 Java 8 代码 private static final String CONTENTS contents final String text This
  • 基类具有不同初始化参数时的方法解析顺序

    我正在尝试理解 Python 中的 MRO 虽然这里有各种各样的帖子 但我并没有特别得到我想要的 考虑两个类A and B源自BaseClass 每个都有一个 init 采用不同的参数 class BaseClass object def
  • 产品方法重载

    所以我正在CodeHS上解决这个问题 然后我被困了很长时间所以决定在这里问 练习是重载 Product 方法以允许将其他类型的值相乘 两个双打 一个 int 和一个 double 一个 double 和一个 int 三个整数 三双 publ
  • 如何比较两个卷并列出修改的文件?

    我有2个硬盘卷 一个是另一个的备份映像 我想比较这些卷并列出所有修改的文件 以便用户可以选择他 她想要回滚的文件 目前 我正在递归新卷并将每个文件的时间戳与旧卷的文件进行比较 如果它们位于旧卷中 显然这是一种错误的做法 这既耗时又错误 有没
  • 2x 提交按钮来操作不同的 URL

    需要 jquery 的帮助来更改我的表单操作 具体取决于按下提交按钮 我找到了一些 javascript 代码 但它不起作用
  • java.lang.VerifyError:堆栈映射与异常句柄处的堆栈映射不匹配

    当我为 testcontroller 实现方面时 启动 springboot 应用程序时出现以下异常 org springframework beans factory BeanCreationException 错误 创建文件中定义的名为
  • HttpWebRequest 中的 http 参数值的大小是否有限制?

    我正在测试几个不同的公共 RESTful API 每个 API 的 http 参数值名称都不同 但在概念上 所有 API 的工作原理都是相似的 然而 这些公司都没有关联 所以这一定是我这边的事情 在 NET 中 尝试获取 HttpWebRe
  • 观察具有传递项目依赖关系的构建?

    您好 我对 C NET 相当陌生 我有一些关于项目依赖性的问题 第一 我的情况 我有一个解决方案 让我们称之为 MyLibrary 它有几个 dll 输出项目 这些项目相互依赖 作为项目引用 也依赖于一些外部库 dll 引用 我确保该项目引
  • 命令“grunt server”的指南针错误

    我正在运行一个安装了nodeJs ruby yeoman compass等的项目 现在我用命令运行我的项目 gt grunt server or gt grunt server force 但它给了我罗盘的以下错误 E CRM worksp
  • 在 MYSQL 中从文本框中的逗号分隔文本添加新行

    我有一个 PHP MYsql 问题 我试图在每个逗号后插入一个新行 基本上 我想要这个功能 假设我们有一个包含以下文本的文本框 篮球 网球 足球 排球 gt 提交按钮 单击提交按钮后 我想在一个表中的每个单词后插入一个新行 基本上 我希望数
  • 在 Eclipse 上测试时如何传递 -D System 属性?

    我正在 Windows 上的 Eclipse 上进行开发 代码部署在 Unix 上 我正在使用 System getProperty key 获取系统属性值 如何在 Eclipse 中传递它 以便我不必修改代码并且它可以在 Eclipse
  • Delphi IDE 中出现“无法更改 OnShow 或 OnHide 中的可见项”错误

    我在使用 Delphi 2006 IDE 时遇到一个非常奇怪的问题 如果 IDE 最小化 并且 PC 被锁定 我返回电脑 解锁并最大化 IDE 有时会收到错误 无法更改 OnShow 或 OnHide 中的可见项 如果发生这种情况 我必须使
  • 挂钩 ASP.Net Core 的 Razor 页面执行

    我正在尝试加入ExecuteAsync 使用我的自定义视图页面 继承自RazorPage 在里面RazorPage类中有一个抽象方法 public abstract Task ExecuteAsync 解析 cshtml 文件 视图 时 该
  • 在 C++ 和 C# 之间传递向量结构

    我有 C 非托管代码 我想从 C 访问它 所以我遵循了一些教程 为我的项目构建了一个 dll 顺便说一句 只有一个类 现在我想从 C 使用它 我使用 p invoke 如下 我的问题是 是否可以编组我的窗口点 以便我可以将它作为向量传递到我
  • 在 Selenium Grid 中指定 Windows 版本(或特定机器)

    我正在设置一个 Selenium 网格 以便涵盖一个测试矩阵 该矩阵需要全面涵盖以下组合 提供相同服务的三台服务器 Windows Server 2003 2008 和 2012 和十个客户端 XP Win7 win8 和 win8 1 将
  • 两个第 n 个位置字符之间的正则表达式

    我试图根据位于两个字符 之间的文本字符串获取一些数据 但可能是第 n 个位置的单词 目前我有以下内容 2 处理以下数据 D20 Mbps U10 Mbps TC4 P 我期望得到的地方 U10 但当第一部分捕获时什么也得不到 D20 Mbp
  • 在 C# 中,如何实例化方法内传递的泛型类型?

    我如何实例化我的类型 TInstantiateType