确定 C# 中的调用对象类型

2024-01-28

不管这是否是一个好主意,是否可以实现一个接口,其中执行函数知道调用对象的类型?

class A
{
   private C;

   public int doC(int input)
   {
      return C.DoSomething(input);
   }
}

class B
{
   private C;

   public int doC(int input)
   {
      return C.DoSomething(input);
   }
}

class C
{
   public int DoSomething(int input)
   {
      if(GetType(CallingObject) == A)
      {
         return input + 1;
      }
      else if(GetType(CallingObject) == B)
      {
         return input + 2;
      } 
      else
      {
         return input + 3;
      }
   }
}

在我看来,这是一种糟糕的编码实践(因为参数不会改变,但输出会改变),但除此之外这可能吗?

我所处的情况是我希望一些特定类型能够调用某个函数,但我不能排除对该函数的访问。 我考虑过有一个“类型”参数

DoSomething(int input, Type callingobject)

但不能保证调用对象会使用 GetType(this)(而不是 GetType(B))来欺骗 B,无论其自身类型如何。

这会像检查调用堆栈一样简单(相对简单)吗?


首先,是的,这样做是一个糟糕的主意,并且破坏了各种可靠的设计原则。如果这是开放的,您绝对应该考虑一种替代方法,例如简单地使用多态性 - 这似乎可以将其重构为非常清晰的单分派情况。

其次,是的,这是可能的。使用System.Diagnostics.StackTrace http://msdn.microsoft.com/en-us/library/system.diagnostics.stacktrace.aspx遍历堆栈;然后得到适当的StackFrame上升一级。然后使用以下方法确定调用者是哪个方法GetMethod() http://msdn.microsoft.com/en-us/library/system.diagnostics.stackframe.getmethod.aspx在那StackFrame。请注意,构建堆栈跟踪是一项潜在昂贵的操作,并且方法的调用者可能会掩盖事物的真正来源。


Edit:OP 的评论非常清楚地表明这可能是通用或多态方法。@devinb,您可能需要考虑提出一个新问题,提供有关您正在尝试执行的操作的更多详细信息,我们可以看看它是否适合提供良好的解决方案。

简短的版本是我最终会 有 30 或 40 个相同的功能 只是偏离一两行。 – devinb(12 秒前)

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

确定 C# 中的调用对象类型 的相关文章

随机推荐

  • 使用 PDO 序列化数据是否危险

    I have 8 input type text name favour 01 我做那8个input进入一个array and serialize it i use PDO将其保存到数据库中 比反序列化它的输出 favour apple f
  • 正则表达式中的 JSLint“不安全 ^”

    JSLint 报告不安全的 对于以下行 这是为什么 或者每当我想否定某个角色类别时它就会抱怨 remove all non alphanumeric comma and dash characters 7s gd j5d a replace
  • Powershell - 使用特殊字符对字符串对象进行排序

    我在跑 S tst ssrst srst2 s zaa s a s zf Sort Object 我不应该得到回报吗 s a S tst s zaa s zf srst2 ssrst 但我得到以下信息 s a srst2 ssrst S t
  • 回溯暴力Java密码破解器

    我的作业是用递归方法来破解给定长度的密码 n 无限且未知 由小英文字母 a z 组成 这是创建随机密码的 Password 类 import java util Random public class Password private St
  • F# 和 ADO.NET - 惯用的 F#

    我刚刚开始学习 F 我昨晚写了这段 F ADO NET 代码 您将通过哪些方式改进语法 使其感觉像惯用的 F let cn new OleDbConnection cnstr let sql SELECT FROM People let d
  • C:按某个键终止程序

    在C语言中 我通常使用getch 函数等待按下键然后结束程序 但最近我读到 由于它不是标准函数 因此使用它是不好的编程习惯 因此 而不是以下内容 int main dosomething getch wait for the user to
  • 如何从矩阵中删除所有带有 NA 的行?

    I have 一个矩阵y它有两列 行数不同 取决于输入参数 第一列中的所有元素都是整数 I need 对于每一行 如果第二列的元素为 NA 我需要删除这一行 我该怎么做 我唯一的想法是创建另一个矩阵 如果第一个矩阵中的一行没有 NA 则将其
  • 从页面读取 XML 响应

    我正在使用 C 和 ASP net 对网页执行 POST 如何读取 XML 响应以确定我的提交是否有错误或是否成功 这是我尝试过的 但它只会返回成功 失败消息 不会显示从页面返回的实际 xml private void Perform th
  • 使用 jquery 滑动导航栏

    我试图为网站创建一个水平导航栏 现在我需要提供一个滑动效果如下 导航菜单有 5 个链接 第 5 个链接是右箭头图像 单击此第 5 个链接 右箭头 时 所有其他 4 个链接应折叠到此第 5 个菜单中 并且右箭头应替换为左箭头 现在只有一个链接
  • pandas多索引如何按第二级屏蔽数据

    我有一个具有多索引的数据框 如下所示 Date Period Value n 20130101 0 12 n 20130101 1 13 20130102 0 13 20130102 1 14 第一级是日期 第二级是周期 我想将周期不为零的
  • 从 Joomla 表单字段插入数据库

    我是 Joomla 的初学者 开发并创建了一个非常简单的模块 如何创建包含 3 个文本字段的表单 然后将输入的值保存到数据库表中 试试这个例子 我们将把用户的名字和姓氏发布到表中 在您的数据库中创建一个表 注意它应该有前缀 jos 我们将这
  • 撤消 git 合并

    我对 Git 没有那么丰富的经验 现在我遇到了一个大问题 这是我当前的分支的样子 feature F1 F2 master M0 M1 M2 M3 M4 bugfix B1 B2 情况 有人做了一件非常糟糕的事情并推送了一个非常糟糕的合并
  • MySQL 插入错误:ER_BAD_FIELD_ERROR:“字段列表”中未知列“2525”

    var convID 2525 var contactUsername blabla var userId 100 var contactId 200 var sql INSERT INTO contacts FK OWNERID FK U
  • 如何/在哪里使用 NSNumberFormatter?

    我是代码新手 在查看了一些答案后仍然需要帮忙 在我的代码中 func labelInformation numLabels text newLabel text 当前结果 228500 23 期望的结果 228 500 23 如何 在哪里使
  • 短信收件箱中对联系人表的错误引用

    我正在尝试从手机的短信收件箱中查找与短信相对应的联系方式 据我了解person列是外键 id的列ContactsContract Contacts 我的问题是我得到了错误的值person来自短信查询的值 一些person联系人表中不存在 I
  • 静态变量还是通过 Bundle 传递变量? [复制]

    这个问题在这里已经有答案了 假设我有一个 ListView 并在列表上设置了一个 OnItemClickListener 传递变量的最佳方式是什么 静态变量 public static String example onItemClick
  • 由于 teamcity,pycharm 调试控制台不可读

    几天以来 我的 pycharm 调试控制台被 teamcity 信息系统性地污染了 例如当我想打印出变量值时 将显示以下内容 gt gt gt df teamcity testStdOut timestamp 2017 11 02T15 5
  • 我希望能够使用故事板左右滚动 UITableViewCell。这不可能吗?

    我已经尝试了所有我能想到的方法 但没有任何效果 与 iOS 7 的 Mail app 中的效果类似 我希望能够左右滑动表格视图的单元格 我希望能够在情节提要和自动布局中执行此操作 因为我的大部分应用程序都是使用这些完成的 我理解带有故事板的
  • 将 WebRTC (AudioTrackSinkInterface) 原始音频写入光盘

    我正在尝试录制 WebRTC 传输的音频PeerConnection MediaStream 我在音轨中添加了一个接收器 它实现了AudioTrackSinkInterface 它实现了OnData method void TestAudi
  • 确定 C# 中的调用对象类型

    不管这是否是一个好主意 是否可以实现一个接口 其中执行函数知道调用对象的类型 class A private C public int doC int input return C DoSomething input class B pri