使用对象类型的字符串名称在 C# 中进行类型转换

2023-12-01

我有以下代码,应该很容易理解

public class Foo
{
    public void FooHasAMethod()
    {
        Console.WriteLine("it is me, foo!!!");
    }
}

public class Bar
{
    public Foo FooProperty { get; set; }
}

public class FooBar
{
    public static void Main()
    {
        Bar bar = new Bar{ FooProperty = new Foo() };
        CallPropertyByName(bar, "Foo");
    }

    public static void CallPropertyByName(Bar bar, string propertyName)
    {
        PropertyInfo pi = bar.GetType().GetProperty(propertyName + "Property");
        object fooObj = pi.GetValue(bar, null);
        ((Foo)fooObj).FooHasAMethod(); // this works
        /* but I want to use 
         * ((Type.GetType(propertyName))fooObj).FooHasAMethod(); This line needs fix
         * which doesnt work
         * Is there a way to type cast using a string name of a object?
         * */
    }
}

如果您使用 .NET 4,这实际上非常简单 =D

dynamic obj = bar;
obj.FooProperty.FooHasAMethod();

但是,如果您只想将结果转换为其他类型,则可以在运行时使用 Convert.ChangeType 方法执行此操作:

object someBoxedType = new Foo();
Bar myDesiredType = Convert.ChangeType(typeof(Bar), someBoxedType) as Bar;

现在,这个与实际类型 Foo 和 Bar 有着很强的联系。但是,您可以通用该方法来获得您想要的:

public T GetObjectAs<T>(object source, T destinationType)
   where T: class
{
     return Convert.ChangeType(typeof(T), source) as T;
}

然后,您可以像这样调用:

Bar x = GetObjectAs(someBoxedType, new Bar());

SomeTypeYouWant x = GetObjectAs(someBoxedType, Activator.CreateInstance(typeof("SomeTypeYouWant")));

使用激活器,您可以在运行时创建您想要的任何类型。并且泛型方法会被推理欺骗,尝试从 boxedType 转换为运行时类型。

此外,如果您只想对某些动态属性值调用方法,那么最佳实践(imo)就是简单地将其转换为某些所需的对象。

ISomething propValue = obj.GetProperty("FooPropery").GetValue(obj, null) as ISomething;

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

使用对象类型的字符串名称在 C# 中进行类型转换 的相关文章

随机推荐

  • (字符串)文字的范围

    我总是尽量避免返回字符串文字 因为我担心它们没有在函数外部定义 但我不确定情况是否如此 我们以这个函数为例 const char return a string void return blah 这是正确的代码吗 它确实对我有用 但也许它只
  • 就像 MySQL 中区分大小写一样

    我有一个 MySQL 查询 SELECT concat ws title description as concatenated HAVING concatenated LIKE SearchTerm 我的表是用 MyISAM 编码的 ut
  • 使用原始音乐数组进行循环 android

    我目前正在尝试创建一个 for 循环 在该循环中它将播放原始文件 完成后 它将继续播放数组中的下一个声音文件 目前它正在一次播放所有文件 关于如何解决这个问题有什么建议吗 我认为完成监听器可能有问题 但不确定 谢谢 my Code pack
  • 使用单个 URL 抓取多个页面上的表

    我正在尝试从 Fangraph 中抓取数据 这些表分为 21 个页面 但所有页面都使用相同的 URL 我对网络抓取 或一般的Python 非常陌生 但Fangraphs没有公共API 所以抓取页面似乎是我唯一的选择 我目前正在使用 Beau
  • Javafx 四边形网格

    我需要在javafx中显示一个四边形网格 每个网格面有4个点我尝试了一些来自fxyz的三角形网格示例library 但不确定它如何适用于四边形 有人可以帮助指出 javafx 中四边形网格的示例吗 OpenJFX 上提供的 3DViewer
  • 如果我在不同的国家/地区,如何知道特定国家/地区的时间?

    我正在尝试这样做 1 获取我的当前时间和时区 2 我从 Google 知道该特定国家 地区的时区 3 计算时区差异 4 从当前时间中减去该差值 这会给我在其他国家的时间 我被困在步骤 3 和 4 了 我得到这样的当前时间 Date d ne
  • Java字符串操作:根据模式从字符串中提取整数和浮点数

    我有以下两个可能的字符串内容 显然 金额总是有所不同 我想提取关键信息并 Case 0 pricesString Case 1 pricesString 0 023 Case 2 pricesString 10 1 46 100 0 16
  • Oracle:发送 JMS 消息的 Java 存储过程

    我正在尝试将点对点 JMS 消息从 Oracle 数据库存储过程发送到 java 应用程序 这两个 点 位于不同的机器上 我已确认它们可以通过 ping 相互通信 我创建了一个 java 应用程序 能够成功地从应用程序服务器内的队列中取出消
  • Android Studio 中未显示 Windows 的构建选项

    我使用的是 Flutter Desktop 的最新稳定版本 并且已经安装了 Visual Studio 2022 但仍然没有显示 Windows 选项 我还需要在稳定版本中运行以下命令吗 flutter config enable
  • 删除 NaN 行在 pandas 中不起作用[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 目前不接受答案 我有一个大约 7k 行和 4 列的文件 很多单元格都是空的 我尝试使用许多 pandas 函数删除它们 但似乎没有任何效果 我尝试过的功能和代码如下 我尝试过的 df df
  • 为什么 GetProcAddress 不起作用?

    首先 我创建一个简单的 dll 名为SimpleDll dll 其头文件 SimpleDll h ifdef MYLIBAPI else define MYLIBAPI declspec dllimport endif MYLIBAPI i
  • javascript 中函数闭包前是否需要分号?

    我想知道这是否是一个编译器错误 或者这就是它应该的方式 使用node js v10 15 3 此代码会抛出错误 var x x false function y console log foo 但这段代码工作正常 var x x false
  • 隐藏/不可见的 Ajax 请求?

    是否可以编写和创建一个无法被 Firefox 中的 Firebug 插件捕获的 JavaScript Ajax 请求 我问这个问题是因为我可以在 Facebook 上看到没有正在进行的 Ajax 请求 但是当我从另一个帐户发送消息时 顶部的
  • 2D CUDA 中值滤波器优化

    我在 CUDA 中实现了一个 2D 中值滤波器 整个程序如下所示 include cuda runtime h include cuda runtime api h include device launch parameters h in
  • MiniZinc 数组中字符串值的索引

    问题 给定一个 MiniZinc 字符串数组 int numStats set of int Stats 1 numStats array Stats of string statNames 使用从 MiniZinc 数据文件加载的数据 n
  • 无法安装 NuGet 包 - 500 内部服务器错误

    这对我来说毫无意义 NuGet 以前工作正常 但现在当我尝试安装软件包时它会抛出服务器错误 我已经卸载并重新安装了最新的 NuGet 但仍然没有成功 PM gt Install Package EntityFramework Install
  • 为什么 LocationManager 没有 LastKnown 位置?

    我想要用户的位置 并且在该用户自己导航后也只需要一次 locationManager LocationManager this getSystemService LOCATION SERVICE location locationManag
  • 如何在 Windows 7 上安装 Windows Phone 8 SDK

    我在 Windows 7 上设置了所有工作区和所有内容 但我也想开发 Windows Phone 8 但正如 Microsoft 网站所述 它无法安装在 Windows 7 上 有人知道如何在 Windows 7 上安装吗 我找到了一个破解
  • iOS Ionic 应用程序中的链接无法立即打开

    我的应用程序的视图之一中有一些链接 Sharing 添加到日历 打开外部链接 在我用来测试应用程序的 iPhone 上 1 和 2 可以工作 但只有当我按下主页按钮然后返回到应用程序时 才会出现共享 日历对话框 谁能建议什么可能导致这个 我
  • 使用对象类型的字符串名称在 C# 中进行类型转换

    我有以下代码 应该很容易理解 public class Foo public void FooHasAMethod Console WriteLine it is me foo public class Bar public Foo Foo