从泛型类实现的接口调用泛型类中的泛型属性

2023-12-22

我有一个具有一个类型参数 (T) 的泛型类。我需要存储这些不同类型的通用对象的集合,因此我创建了一个通用类按照建议实现的接口here https://stackoverflow.com/questions/754341/adding-generic-object-to-generic-list-in-c。在迭代包含 Interface 对象集合的泛型列表时,我需要访问类型 T 的泛型类中的一个属性。到目前为止,我能够获取该值的唯一方法是使用反射调用方法。

interface ISomeClass {

//?
}

class SomeClass<T> : ISomeClass {

 T ValueINeed { get; set;}
}

class ClassThatHasListOfGenericObjects{

 List<ISomeClass> _l = new List<ISomeClass>();

 public AddToList<T>(T someClass) : where T : ISomeClass {

 _l.Add(someClass);

 }

 public SomeMethod(){

   foreach(ISomeClass i in _l){

   i.ValueINeed; //I don't know how to access the property in the generic class

   }
 }
}

在我看来,你有两个选择。最简单的选择是在接口上公开值(作为对象)(也可能是其类型)。看起来是这样的:

interface ISomeClass
{
    object ValueINeed { get; set; }
    // Only needed if you care about static type rather than using ValueINeed.GetType()
    Type TypeOfValue { get; }
}

class SomeClass<T> : ISomeClass
{
    public T ValueINeed { get; set; }
    public Type TypeOfValue { get { return typeof(T); } }

    object ISomeClass.ValueINeed { get { return ValueINeed; } set { ValueINeed = (T)value; } }
}

这样做的缺点是需要进行一些转换,并且您可能需要调用反射来对该值执行某些操作。它的优点是易于理解和实施。

另一种选择是编码一个“存在类型”,它真正代表一个SomeClass<T>对于一些未知的T(像一个SomeClass<?>在爪哇)。这要复杂得多且难以遵循,但避免了任何强制转换:

interface ISomeClassUser<X>
{
    X Use<T>(SomeClass<T> s);
}

interface ISomeClassUser
{
    void Use<T>(SomeClass<T> s);
}

interface ISomeClass
{
    X Apply<X>(ISomeClassUser<X> user);
    void Apply(ISomeClassUser user);
}

class SomeClass<T> : ISomeClass
{
    public T ValueINeed { get; set; }

    public X Apply<X>(ISomeClassUser<X> user) { return user.Use(this); }
    public void Apply(ISomeClassUser user) { user.Use(this); }
}

// Assumes you want to get a string out, use a different generic type as needed
class XmlUser : ISomeClassUser<string>
{
    public string Use<T>(SomeClass<T> s)
    {
        string str = "";
        // do your conditional formatting here, branching on T as needed
        // ...
        return str;
    }
}

class ClassThatHasListOfGenericObjects
{
    List<ISomeClass> _l = new List<ISomeClass>();
    XmlUser user = new XmlUser();

    public string SomeMethod()
    {
        string s = "";
        foreach (ISomeClass i in _l)
        {
            s += i.Apply(user);
        }
        return s;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从泛型类实现的接口调用泛型类中的泛型属性 的相关文章

  • 更新面板工作速度非常慢

    我正在编写一个用户可以注册的应用程序 注册时 可以选择多个选项 并根据这些注册字段可见或不可见以及是否必需 我想出了一个想法 所有字段都将位于 updatePanel 中 当用户更改注册选项时 我将在服务器端设置这些字段的可见性 它可以工作
  • 在 CPP 类中将 C 函数声明为友元

    我需要在 C 函数中使用类的私有变量 我正在做这样的事情 class Helper private std string name public std getName return name friend extern C void in
  • 前向声明类型和“已声明为类类型的非类类型”

    我对以下代码有问题 template
  • MVC3中设置下拉列表中的所选项目

    我必须为视图中的下拉列表设置所选项目 但它不起作用 View div class editor label Html LabelFor model gt model Gender div div class editor field Htm
  • 传递 constexpr 对象

    我决定给予新的C 14的定义constexpr旋转并充分利用它 我决定编写一个小的编译时字符串解析器 然而 我正在努力保持我的对象constexpr将其传递给函数时 考虑以下代码 include
  • 如何将 .txt 文件中的数据转换为 xml? C#

    我在一个文本文件中有数千行数据 我想通过将其转换为更容易搜索的内容来轻松搜索 我希望 XML 或其他类型的大型数据结构 尽管我不确定它是否是最好的对于我的想法 每行的数据如下所示 第 31 册 托马斯 乔治 32 34 154 每本书都不是
  • 强制初始化模板类的静态数据成员

    关于模板类的静态数据成员未初始化存在一些问题 不幸的是 这些都没有能够帮助我解决我的具体问题的答案 我有一个模板类 它有一个静态数据成员 必须为特定类型显式实例化 即必须专门化 如果不是这种情况 使用不同的模板函数应该会导致链接器错误 这是
  • 语音识别编程问题入门

    所以 你们可能都看过 钢铁侠 其中托尼与一个名为贾维斯的人工智能系统进行交互 演示剪辑here http www youtube com watch v Go8zsh1Ev6Y 抱歉 这是广告 我非常熟悉 C C 和 Visual Basi
  • 如何在 C# Designer.cs 代码中使用常量字符串?

    如何在 designer cs 文件中引用常量字符串 一个直接的答案是在我的 cs 文件中创建一个私有字符串变量 然后编辑 Designer cs 文件以使用此变量 而不是对字符串进行硬编码 但设计者不喜欢这样抛出错误 我明白为什么这行不通
  • 即使没有异步,CallContext.LogicalGetData 也会恢复。为什么?

    我注意到CallContext LogicalSetData LogicalGetData不按照我期望的方式工作 内部设置的值async方法得到恢复即使没有异步或任何类型的线程切换 无论如何 这是一个简单的例子 using System u
  • 是否使用 C# 数据集? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我对 C 中的数据集概念有点困惑 编码 ASP NET 站点 但这并不重要 在我的阅读中 我了解到它们 本质上 用作我的应用程序和我的
  • 在 C# 中为父窗体中的子窗体控件添加事件处理程序

    我有两种形式 一种是带有按钮和文本框的父表单 单击该按钮时 将打开一个对话框 该子窗体又包含一个文本框和一个按钮 现在我想要的是 每当子表单文本框中的文本更改时 父表单文本框中的文本会自动更改 为了获得这个 我所做的是 Form3 f3 n
  • 如何最好地以编程方式将 `__attribute__ ((unused))` 应用于这些自动生成的对象?

    In my makefile我有以下目标 它将文本 HTML 资源 编译 为unsigned char数组使用xxd i http linuxcommand org man pages xxd1 html 我将结果包装在匿名命名空间和标头保
  • 比较:接口方法、虚方法、抽象方法

    它们各自的优点和缺点是什么 接口方法 虚拟方法 抽象方法 什么时候应该选择什么 做出这一决定时应牢记哪些要点 虚拟和抽象几乎是一样的 虚方法在基类中有一个实现 可以选择重写 而抽象方法则没有 并且must在子类中被覆盖 否则它们是相同的 在
  • C++ 对象用 new 创建,用 free() 销毁;这有多糟糕?

    我正在修改一个相对较大的 C 程序 不幸的是 并不总是清楚我之前的人使用的是 C 还是 C 语法 这是在一所大学的电气工程系 我们 EE 总是想用 C 来做所有事情 不幸的是 在这种情况下 人们实际上可以逃脱惩罚 但是 如果有人创建一个对象
  • 模板类中的无效数据类型生成编译时错误?

    我正在使用 C 创建一个字符串类 我希望该类仅接受数据类型 char 和 wchar t 并且我希望编译器在编译时使用 error 捕获任何无效数据类型 我不喜欢使用assert 我怎样才能做到这一点 您可以使用静态断言 促进提供一个 ht
  • C++:为什么 numeric_limits 对它不知道的类型起作用?

    我创建了自己的类型 没有任何比较器 也没有专门化std numeric limits 尽管如此 由于某种原因 std numeric limits
  • 了解 Lambda 表达式和委托 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我已经尝试解决这个问题很长一段时间了 阅读在线博客和文章 但到目前为止还没有成功 什么是代表 什么是 Lambda 表达式 两者的优点
  • EntityFramework 6.0.0.0 读取数据,但不插入

    我创建了一个基于服务的数据库 folderName gt Add New Item gt Data gt Service based Database文件到 WPF 应用程序中 然后我用过Database First方法并创建了Person
  • 当用户更改 Windows 中的语言键盘布局时如何通知?

    I want to show a message to user when the user changes the language keyboard layout of Windows for example from EN to FR

随机推荐

  • 在已知坐标的图像顶部应用浅透明蒙版

    我以这种方式将坐标存储在 x 轴和 y 轴中 rects 715 49 716 49 711 50 712 50 713 50 image cv2 imread some image jpg 如何将稍微透明的颜色层添加到存储在的坐标中rec
  • 控制 eGit 对符号链接的处理

    我正在建立一个项目 该项目将在我的组织中的几个程序员之间共享 我们正在使用 git 我是个新手 项目目录包含指向不应受版本控制的文档目录的符号链接 我想将版本控制下的符号链接维护为符号链接 而不是取消引用它们并将符号链接目录的所有内容置于版
  • 如何使用 Java 8 将方法传递给注释? [复制]

    这个问题在这里已经有答案了 我想将方法 传递给注释 这样的事情可能吗 MyAnnotation method MyClass myMethod private String myVariable 传递方法不是一种选择 相反 传递以下内容应该
  • jquery 中 $.each 内的appendTo()似乎会导致闪烁

    当appendTo 在 each里面时会导致闪烁 each jsob Table function i employee div class resultsdiv br span class resultName employee Emp
  • 在哪里可以找到“收缩期间发现警告”的警告?

    将 RxAndroid 和 Retrofit 库添加到我的 gradle 并编译后 我收到以下错误 显示在我的 Android Studio 消息面板中 Error Execution failed for task app transfo
  • Discord.py Bot 如何播放本地文件中的音频

    基本上就是标题 我已经安装了 ffmpeg 和discord py audio 我只需要了解它是如何工作的 找不到任何本地音频文件的教程 我无法理解文档中的任何内容 这是播放本地音频文件的功能 我在使用 FFmpeg 时遇到问题 因此我对
  • 选择过去 30 天的所有订单,并计算每天的数量

    我正在尝试选择过去 30 天内的所有订单来自一位客户 所以我需要 customer id customer id 和计算我每天有多少订单对于那一位客户 我需要得到这样的数组 Array 1 gt Array orders gt 41 dat
  • ref、toRef 和 toRefs 之间有什么区别

    我刚刚开始使用 Vue 3 和 Composition API 我想知道两者之间有什么区别ref toRef and toRefs Vue 3 ref A ref https v3 vuejs org api refs api html r
  • 如何正确使用 ASP.NET Core 共享框架或如何单独使用其程序集?

    情况 在我们的应用程序中 我们有一个WPF客户端 and an ASP NET Core 服务器 两者都使用 NET 5 我们将所有 DLL 存储在server和client当用户登录时从服务器下载所有必需的 DLL 最初 client独立
  • 在 Post 请求上触发 Socket

    尝试在 POST 请求上发出消息 收到错误消息 无法读取属性 emit未定义的 app post webhook orders updated function req res next io socket emit order Order
  • 在 Azure Devops 上的 cURL 请求中使用环境变量

    我正在尝试使用 Azure DevOps 上的 cURL 通过命令行任务将 zip 文件上传到 Netlify 显然我不想在 yaml 文件中包含 Netlify 访问令牌 因此我为它创建了一个秘密变量 使用 UI 设计器 并使用 然而我不
  • 为什么创建了很多spark-warehouse文件夹?

    我在ubuntu上安装了hadoop 2 8 1 然后在其上安装了spark 2 2 0 bin hadoop2 7 我使用 Spark shell 并创建了表格 我再次使用直线并创建了表格 我观察到创建了三个不同的文件夹 名为spark
  • 共享文件而不将其保存在外部存储上

    我使用以下代码允许用户共享位图 try File save dir Environment getExternalStorageDirectory FileOutputStream out new FileOutputStream save
  • 在 Word 中获取本地化/未本地化的样式名称 (VSTO)

    我有一个单词插件 需要帮助处理样式名称 我使用 get Style NameLocal 获得段落样式 这将返回本地化名称 具体取决于 Office 运行所用的语言 只要有内置样式 我就找到了一种方法来获取本地名称 方法是将 wdBuiltI
  • 在构造函数中初始化虚拟属性是否错误? [复制]

    这个问题在这里已经有答案了 在构造函数中初始化虚拟属性是否错误 它只是感觉不对 因为如果您重写派生类中的属性 该属性将首先使用基类构造函数中的值进行初始化 然后由派生类构造函数再次对其进行赋值 有没有其他方法可以做到这一点 我正在谈论这样的
  • php imagick setGravity 函数不适用于compositeImage() 函数

    我正在为一个项目使用 php Imagick 类 我尝试合成一个图像 改变图像的重力 我的意思是 我想将目标图像合成到中间或顶部中心 I use imageOrg gt setGravity imagick GRAVITY CENTER I
  • kafka + 如何避免磁盘存储空间不足

    我想描述我们的一个生产集群上的以下案例 我们有 HDP 版本 2 6 4 的 ambari 集群 集群包括 3 台 kafka 机器 每个 kafka 都有 5 T 的磁盘 我们看到的是所有kafka磁盘的大小都是100 所以kafka磁盘
  • R:分配数据框列的变量标签

    我正在努力处理 data frame 列的变量标签 假设我有以下数据框 更大数据框的一部分 data lt data frame age c 21 30 25 41 29 33 sex factor c 1 2 1 2 1 2 labels
  • memset bool 为 0 安全吗?

    假设我有一些legacy无法更改的代码 除非bug被发现 它包含以下代码 bool data 32 memset data 0 sizeof data 这是设置所有内容的安全方法吗bool在数组中到false value 更一般地说 安全吗
  • 从泛型类实现的接口调用泛型类中的泛型属性

    我有一个具有一个类型参数 T 的泛型类 我需要存储这些不同类型的通用对象的集合 因此我创建了一个通用类按照建议实现的接口here https stackoverflow com questions 754341 adding generic