查找接口实例背后的具体类型

2024-03-11

长话短说,我有一个 C# 函数,它对作为对象实例传入的给定类型执行任务。当传入类实例时,一切正常。但是,当对象被声明为接口时,我真的很想找到具体的类并对该类类型执行操作。

这是普遍存在的错误示例(例如不正确的属性大小写等):

public interface IA
{
    int a { get; set; }
}
public class B : IA
{
    public int a { get; set; }
    public int b { get; set; }
}
public class C : IA
{
    public int a { get; set; }
    public int c { get; set; }
}

// snip

IA myBObject = new B();
PerformAction(myBObject);

IA myCObject = new C();
PerformAction(myCObject);

// snip

void PerformAction(object myObject)
{
    Type objectType = myObject.GetType();   // Here is where I get typeof(IA)
    if ( objectType.IsInterface )
    {
        // I want to determine the actual Concrete Type, i.e. either B or C
        // objectType = DetermineConcreteType(objectType);
    }
    // snip - other actions on objectType
}

我希望 PerformAction 中的代码对其参数使用反射,并看到它不仅仅是 IA 的实例,而且是 B 的实例,并通过 GetProperties() 查看属性“b”。如果我使用 .GetType() 我得到 IA 的类型 - 不是我想要的。

PerformAction 如何确定 IA 实例的底层具体类型?

有些人可能会建议使用抽象类,但这只是我的坏例子的局限性。该变量最初将被声明为接口实例。


Type objectType = myObject.GetType();

根据您的示例,仍然应该为您提供具体类型。

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

查找接口实例背后的具体类型 的相关文章

随机推荐

  • 如何开始信息提取?

    您能否推荐一个培训路径来开始并变得非常擅长信息提取 我开始阅读它是为了做我的一个爱好项目 很快意识到我必须擅长数学 代数 统计 概率 我读过一些关于不同数学主题的入门书籍 而且非常有趣 寻找一些指导 请帮忙 更新 只是为了回答其中一条评论
  • 向 Google Play Android Developer API 发出 HTTP post 请求

    我正在尝试授权 Google Play Android Developer API 我正处于需要发出 HTTP POST 请求以交换访问令牌和刷新令牌的授权代码的步骤 Google https developers google com a
  • 地图中的键类型不匹配:预期 .. 文本,收到 ... LongWritable

    我有一个简单的 hadoop 应用程序 它获取一个 CSV 文件 然后用 分割条目 然后计算第一个项目 以下是我的代码 package com bluedolphin import java io IOException import ja
  • 创建 webdriver 后 Selenium firefox 配置文件更新下载目录

    我想知道启动驱动程序后如何更新 更改 selenium 中的下载位置 在创建配置文件和启动网络驱动程序期间设置下载目录不是问题 启动 webdriver 根据数据类型更改目录后会出现此问题 例如 如果dl doc是word保存在Docs W
  • Hibernate + Spring 异常:未知实体

    服务器启动时我遇到异常 服务器使用 Intellij IDEA 启动 我不知道如何解决它 我是休眠和春季的新手 提前致谢 SEVERE Context initialization failed org springframework be
  • Ruby on Rails 可以部署在 Azure 网站上吗?

    我可以在 Azure 网站上部署 Ruby on Rails 吗 还没有 目前仅支持 NET 和 PHP
  • 在Python中的re.sub中获取组匹配

    在 Perl 中 我可以同时进行替换并捕获小组比赛 例如 my string abcdef123 string s d my groupMatched 1 groupMatched is 123 在 Python 中 我可以使用 re su
  • 如何正确使用 Pyenv 和 venv?

    文章阅读 Python 虚拟环境 入门 https realpython com python virtual environments a primer Pyenv 为特定项目安装多个Python版本 https www tecmint
  • CATransaction 没有动画

    我在 XCode 中创建了一个新的基于视图的应用程序 在 ViewController 中 我修改的唯一代码如下所示 void viewDidLoad super viewDidLoad UIView newView UIView allo
  • 根据模板参数选择联合成员

    我正在处理 C 中的联合 我想要一个函数模板 它可以根据模板参数访问活动联合成员 代码类似于 doSomething 只是一个示例 union Union int16 t i16 int32 t i32 enum class ActiveM
  • 如何将 slug 和 ID URL 添加到 Laravel 4 Route?

    我想添加漂亮的Slug我的 Laravbel 项目的 URL 我目前正在使用身份证号码 我的目标是继续使用 Numbers 但也使用 Slugs 来获得更好的 SEO URL 因此 Slug 或 ID 都会加载正确的页面 以下是我目前的Ro
  • 为什么即使我添加了电子邮件地址,Github 也不显示我的贡献?

    上个月 我向我的 master 分支做了很多提交 但我意识到我没有将我的电子邮件地址添加到我的本地 git 配置设置中 现在我添加了我的电子邮件地址 我的贡献仍然没有显示在图表中 只有新的提交会显示在贡献中 但旧的提交 在添加我的电子邮件地
  • 如何在 jQuery 中选择表格单元格而不选择嵌套表格单元格

    我只想选择表中第一级 td 元素 而不选择任何嵌套表的单元格 例如 table tr td this one td td this one table tr td td but not this one or any deeper nest
  • 为什么C# HttpClient无法调用这个URL(总是超时)?

    我一直在开发一个确定网页信息的应用程序 其中的组成部分之一涉及向 URL 发出 HTTP GET 请求 抓取 HTML 并对其进行分析 这对于我向它抛出的每个 URL 都运行良好 除了一个 罪魁祸首是 NETHttpClient请求问题域内
  • Cassandra一致性级别和IF NOT EXISTS子句问题

    卡桑德拉3 1 NodeJS 驱动程序 cassandra driver 3 0 0 键空间是使用以下语句创建的 如果不存在则创建键空间 xxxxxx WITH REPLICATION class SimpleStrategy replic
  • Android OBD-II 如何清除行驶距离(PID0131)?

    我正在开发一个应用程序 我需要计算从 A 点到 B 点 乘汽车 行驶的距离 I asked 榆树电子 http www elmelectronics com 芯片组制造商 他们表示没有标准的 OBD II PID 来从里程表返回里程 尽管汽
  • 无法将参数 1 从“const char [5]”转换为“LPCTSTR”

    我正在使用这个代码项目 http www codeproject com Articles 10138 Voice Recording Playing back using simple classes http www codeproje
  • 使用 NumberFormat 或 DecimalFormat

    在大多数情况下 我们如何证明合理性 何时使用 NumberFormat getInstance 我们什么时候使用 new DecimalForamt 如果要指定数字的格式 则必须使用 DecimalFormat 构造函数 如果您想要 大多数
  • 读取“文件”对象的内容?

    所以我有一个 文件 对象 通过处理从桌面拖放文件来检索 我可以使用ajax将文件发送到服务器 然后将它们返回给javascript来处理它们 但不做这一切就可以阅读它的内容吗 在这里 玩弄这个小提琴 http jsfiddle net jc
  • 查找接口实例背后的具体类型

    长话短说 我有一个 C 函数 它对作为对象实例传入的给定类型执行任务 当传入类实例时 一切正常 但是 当对象被声明为接口时 我真的很想找到具体的类并对该类类型执行操作 这是普遍存在的错误示例 例如不正确的属性大小写等 public inte