Tom*_*ski 27 c# types casting .net-3.5
我有一个对象:
ExampleClass ex = new ExampleClass();
Run Code Online (Sandbox Code Playgroud)
和:
Type TargetType
Run Code Online (Sandbox Code Playgroud)
我想将ex类型转换为TargetType所描述的类型:
Object o = (TargetType) ex;
Run Code Online (Sandbox Code Playgroud)
但当我这样做时,我得到:
找不到类型或命名空间名称't'
那怎么做?我在这里遗漏了一些东西吗?
更新:
我想得到这样的东西:
public CustomClass MyClassOuter
{
get
{
return (CustomClass) otherClass;
}
}
private otherClass;
Run Code Online (Sandbox Code Playgroud)
因为我会有很多这样的属性,我想这样做:
public CustomClass MyClassOuter
{
get
{
return (GetThisPropertyType()) otherClass;
}
}
private SomeOtherTypeClass otherClass;
Run Code Online (Sandbox Code Playgroud)
语境:
通常在我班级的上下文中,我需要创建许多属性.并且在每一个都取代铸造属性的类型.它对我来说似乎没有意义(在我的上下文中),因为我知道返回类型是什么,我想写一些代码来为我做演员.也许是仿制药的情况,我还不知道.
这就像我可以保证在这个属性中我得到正确的对象并且是正确的类型并且100%能够将它转换为属性类型.
所有我需要这样做,以便我不需要在每个属性中指定它必须"将值转换为CustomClass",我想做一些类似"将值转换为与此属性相同的类"的内容.
例如:
class MYBaseClass
{
protected List<Object> MyInternalObjects;
}
class MyClass
{
public SpecialClass MyVeryOwnSpecialObject
{
get
{
return (SpecialClass) MyInteralObjects["MyVeryOwnSpecialObject"];
}
}
}
Run Code Online (Sandbox Code Playgroud)
好吧 - 我可以制作上面这样的许多属性 - 但是有两个问题:
1)我需要在MyInternalObjects上指定对象的名称,但它与属性名称相同.我用System.Reflection.MethodBase.GetCurrentMethod().名称解决了这个问题.
2)在每个属性中,我需要将对象从MyInternalObjects转换为不同的类型.例如,在MyVeryOwnSpecialObject中 - 到SpecialClass.它总是和财产一样.
这就是为什么我想做这样的事情:
class MYBaseClass
{
protected List<Object> MyInternalObjects;
}
class MyClass
{
public SpecialClass MyVeryOwnSpecialObject
{
get
{
return (GetPropertyType()) MyInteralObjects[System.Reflection.MethodBase.GetCurrentMethod().Name];
}
}
}
Run Code Online (Sandbox Code Playgroud)
而现在担心:好的,为什么?因为在我的应用程序中,我将获得安全类型等所有好处(intellisense).
第二个:但现在你会在这个地方失去类型安全吗?不,因为我非常确定我的列表中有我的类型的对象.
wei*_*ure 11
Object o = (TargetType) ex;
Run Code Online (Sandbox Code Playgroud)
这段代码没用.您可能在右侧有一个类型,但它仍然只是左侧的一个对象.您不能像这样使用特定于TargetType的功能.
这是您可以调用给定类型的未知对象的方法:
object myObject = new UnknownType();
Type t = typeof(UnknownType); // myObject.GetType() would also work
MethodInfo sayHelloMethod = t.GetMethod("SayHello");
sayHelloMethod.Invoke(myObject, null);
Run Code Online (Sandbox Code Playgroud)
使用此UnknownType类:
class UnknownType
{
public void SayHello()
{
Console.WriteLine("Hello world.");
}
}
Run Code Online (Sandbox Code Playgroud)
现在看来这是不可能的,但很快就会在 .NET 4.0 中称为“动态”的新功能中提供:
http://www.codeguru.com/vb/vbnet30/article.php/c15645__4/