C# 是否可以将一个变量强制转换为另一个变量中存储的类型?

C# 是否可以将一个变量强制转换为另一个变量中存储的类型?,c#,casting,C#,Casting,这就是我需要做的: object foo = GetFoo(); Type t = typeof(BarType); (foo as t).FunctionThatExistsInBarType(); 像这样的事情可以做吗?不,你不能。C#不执行 您必须实现一个接口并强制转换到它 (不过也有人试图这样做。请看一个例子。)您可以使用该方法 您最初的问题有缺陷,因为您要求将变量视为编译时未知的类型,但请注意,在声明变量时,在左侧定义了字符串。从3.5开始,C#是静态类型的 一旦dynamic可用,

这就是我需要做的:

object foo = GetFoo();
Type t = typeof(BarType);
(foo as t).FunctionThatExistsInBarType();
像这样的事情可以做吗?

不,你不能。C#不执行

您必须实现一个接口并强制转换到它

(不过也有人试图这样做。请看一个例子。)

您可以使用该方法


您最初的问题有缺陷,因为您要求将变量视为编译时未知的类型,但请注意,在声明变量时,在左侧定义了字符串。从3.5开始,C#是静态类型的

一旦dynamic可用,您可以执行以下操作:

dynamic foo = GetFoo();
foo.FunctionThatExistsInBarType(); 
例如,当您不知道类型是什么,但知道它将始终支持现有的实例方法函数sinbartype()

目前,您不得不使用反射(或代码生成,这实际上相当于相同的东西,但前期成本更高,后期速度更快)


如果您在编译时知道所有必需的类型,是否(某种程度上)可能:

class BarFoo {}
class Foo {}
class Bar {}

class Program
{
    static void Main( )
    {
        var foo = new Foo( );
        var bar = new Bar( );
        var barfoo = new BarFoo( );

        Console.WriteLine(DoStuff(foo));
        Console.WriteLine(DoStuff(bar));
        Console.WriteLine(DoStuff(barfoo));

    }

    static string DoStuff(Foo foo) { return "DoStuff(Foo foo)"; }
    static string DoStuff(Bar bar) { return "DoStuff(Bar bar)"; }
    static string DoStuff(Base fb) { return "DoStuff(object fb)"; }
}
输出:

Dostuff(Foo foo)
Dostuff(Bar bar);
DoStuff(object fb);

如果你最终实现了许多基本上完全相同的方法,考虑实现一个接口。

因为在C语言中添加了动态,我想我们可以这样做:

class Program {
    static void Main(string[] args) {
        List<int> c = new List<int>(); 
        double i = 10.0;
        Type intType = typeof(int);
        c.Add(CastHelper.Cast(i, intType)); // works, no exception!
    }
}

class CastHelper {
    public static dynamic Cast(object src, Type t) {
        var castMethod = typeof(CastHelper).GetMethod("CastGeneric").MakeGenericMethod(t);
        return castMethod.Invoke(null, new[] { src });
    }
    public static T CastGeneric<T>(object src) {
        return (T)Convert.ChangeType(src, typeof(T));
    }
}
类程序{
静态void Main(字符串[]参数){
列表c=新列表();
双i=10.0;
类型intType=typeof(int);
c、 Add(CastHelper.Cast(i,intType));//有效,无异常!
}
}
类CastHelper{
公共静态动态转换(对象src,类型t){
var castMethod=typeof(CastHelper).GetMethod(“CastGeneric”).MakeGenericMethod(t);
返回castMethod.Invoke(null,new[]{src});
}
公共静态T CastGeneric(对象src){
return(T)Convert.ChangeType(src,typeof(T));
}
}

可以。查看GvS的答案:-)您仍然需要实现接口(本例中为IConvertible),并提前知道要转换到的类型。我将此答案标记为已接受的答案,因为我使用了Quassnoi的建议并实现了一个接口来转换它,但是GvS和shuggycouk的答案也很好。这只有在对象实现IConvertible时才有用。我仅以字符串为例。问题是我不知道目标类型,因此无法执行此xyz bar=(xyz)转换。更改。。。cast.Convert.ChangeType不是强制转换,它正在转换。i、 e.创建指定类型的新对象。如果你想让演员说我收集这是行不通的。?在这里的示例中,我猜
var bar=(string)foo会做同样的事情。。。您没有使用
Convert.ChangeType
进行强制转换,而是在使用
(string)…
时进行了强制转换。
您如何知道它是您希望位于示例最后一行中等号左侧的字符串?换句话说,你将如何处理bar,这意味着你不能使用“object bar=(object)foo;”?我不知道,字符串只是一个例子。我编辑了代码段,字符串类型只是一个例子(不是一个好例子);我编辑了代码片段,希望现在更清晰。对-对于这个(预动态)您必须使用反射。我会编辑以考虑到这一点呃。。四年后。。哦,这不是鸭子打字。它的多态性(应用于函数
DoStuff
)。这就像其他解决方案所没有的魅力。
Dostuff(Foo foo)
Dostuff(Bar bar);
DoStuff(object fb);
class Program {
    static void Main(string[] args) {
        List<int> c = new List<int>(); 
        double i = 10.0;
        Type intType = typeof(int);
        c.Add(CastHelper.Cast(i, intType)); // works, no exception!
    }
}

class CastHelper {
    public static dynamic Cast(object src, Type t) {
        var castMethod = typeof(CastHelper).GetMethod("CastGeneric").MakeGenericMethod(t);
        return castMethod.Invoke(null, new[] { src });
    }
    public static T CastGeneric<T>(object src) {
        return (T)Convert.ChangeType(src, typeof(T));
    }
}