在C#中使用get类型,然后将其转换为该类型

4
我有这样的代码:

code

var t = SomeInstanceOfSomeClass.GetType();
((t)SomeOtherObjectIWantToCast).someMethodInSomeClass(...);

那样不行,编译器会提示错误,说需要类型或名称空间。

你该怎么做呢?我相信这其实很显然...


你想用它做什么?即使你能够这样做,由于C#是一种静态类型语言,你也无法在其上调用方法或其他内容。 - Mehrdad Afshari
复制:https://dev59.com/KXNA5IYBdhLWcg3wa9Gp - Mehrdad Afshari
4个回答

8
C# 4.0允许使用动态类型dynamic来实现此功能。但是,除非你正在进行COM互操作或编写动态语言的运行时,否则几乎肯定不希望这样做(Jon是否有其他用例?)。

2
没错,有几个:双重分派变得简单易用了(但牺牲了编译时的安全性);可以在泛型中使用操作符;使调用泛型方法更加简单,即使在执行时才知道类型。 - Jon Skeet
“dynamic” 在一些其他场景中也很有用,主要是不仅仅针对动态语言编写运行时,而是与动态环境(IronPython、IronRuby、Javascript 等)进行交互。 - Mehrdad Afshari
@Jon - 你是怎么知道你被召唤了的?! - Russ Cam
感谢您的输入。 :) 对于这种类型的结构,我更多地关注实现方面而不是用例。 - Sam Harwell
在使用模型绑定时,我在处理MVC API控制器时使用了动态绑定。例如,如果您始终希望在ActionFilter中匹配API令牌,则动态绑定模型并检查必要参数比测试20或30个单独的对象类型要容易得多。 - dalemac

3

我在这里回答了一个重复的问题然而,如果你只需要在C# 3.0及以下版本中调用任意对象实例的方法,你可以使用反射:

obj.GetType().GetMethod("someMethodInSomeClass").Invoke(obj);

1
if(t is ThisType) {
    ThisType tt = (ThisType)t;
    /*do something here*/
}else if(t is ThatType) {
    ThatType tt = (ThatType)t;
    /*do something here*/
}

那就是在C# 3.5及以下版本中你能做到的最好的了。


0
为了按照你在问题中描述的方式进行转换,你必须在编译时而不是运行时声明类型。这就是为什么你遇到问题的原因。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接