我正在编写一个包含任何类型变量的类。为此,我将变量(作为object
引用)及其Type
存储起来。但是当我尝试将object
强制转换回正确的类型时,我得到错误CS0118,因为我使用了一个字段(类型为Type
)作为类型。
这是我的班级:
public class Node
{
Type m_oType = null;
public Type Type
{
get { return m_oType; }
set { m_oType = value; }
}
object m_oValue = null;
public object Value
{
get { return m_oValue; }
set
{
if (m_oValue == null)
{
if (value is m_oType) // ERROR CS0118
{
m_oValue = value;
}
}
}
}
}
我尝试在线搜索一种方法(即使用强制转换运算符,as
和is
),但我不断获得有关投射变量的基本教程。有人可以给我一个指针,告诉我如何实现这一目标吗?谢谢。
答案 0 :(得分:3)
我怀疑你想要这样的东西(但请继续阅读):
if (m_oType.IsAssignableFrom(value.GetType()))
请注意,我们在 m_oType
上将其称为,而不是将m_oType
传递给。从IsAssignableFrom
的返回值上的文档开始,其中c
是参数:
如果c和当前Type表示相同的类型,或者当前Type在c的继承层次结构中,或者当前Type是c实现的接口,或者c是泛型类型参数且是current Type表示c。
的约束之一
例如,typeof(object).IsAssignableFrom(typeof(string))
会返回true
,因为object
位于string
的继承层次结构中。
编辑:如上所述,如果m_oType
为空或value
为空,则会中断。我们可以轻松地绕value
null
,但如果m_oType
为空,则不清楚您期望它做什么。也许你应该在Type
属性(和构造函数)的setter中阻止它?然后使用:
// This will always store a null
if (value == null || m_oType.IsAssignableFrom(value.GetType()))
// This will never store a null
if (value != null && m_oType.IsAssignableFrom(value.GetType()))
答案 1 :(得分:2)
像
这样的东西if (m_oType.IsAssignableFrom(value.GetType()))
但我很确定你应该看看泛型。
public class Node<T>
{
T m_oValue = null;
public T Value
{
get { return m_oValue; }
set
{
if (m_oValue == null)
{
m_oValue = value;
}
}
}
}