这就是我想要实现的目标:
我们创建了自己的实体框架,并将实体对象传递给自定义控件。基于类型(字符串,布尔值,...)和我们想要在页面上创建控件的权限不同。
例如:
type=string, access=read => display as label
type=string, access=edit => display as textbox
type=boolean, access=read => display as disabled checkbox
type=boolean, access=edit => display as enabled checkbox
我们可能会在稍后添加更多内容,但我们会从这些开始。
我创建了一个继承自usercontrol类的自定义控件。控件在页面上完美呈现,这部分我可以管理。
然而问题是从中获取数据。 Control没有text或checked属性。所以我必须创建自己的Value属性。 我想要这个属性做的是当它是一个复选框时返回一个布尔值,当它是一个标签或一个文本框时返回Text。 这有可能吗?如果可以,我该怎么做? (我听说过有关反射的事情,但我不确定如何给出一个多重回归类型的可能性)
答案 0 :(得分:0)
由于C#中的所有内容都隐式继承自System.Object
(偶数值类型),因此您可以将其返回并稍后将其转换为所需类型。 is
运算符可用于检查类型。
object obj = "foo";
bool isString = obj is string; //true
或者,C#有一个dynamic
关键字,可用于保存任何类型。
class Foo
{
public dynamic Value { get; private set; }
public Foo( string value )
{
this.Value = value;
}
public Foo( bool value )
{
this.Value = value;
}
}
这允许您在不检查类型和转换的情况下使用运算符和调用实例成员,但要注意,框架通过运行时的反射解析dynamic
,这意味着在编译时不会捕获任何错误时间,你最终会得到例外。
以下编译很好,但会在运行时抛出。
Foo BooleanFoo = new Foo( true );
Foo StringFoo = new Foo( "StackOverflow" );
if( BooleanFoo.Value ) //returns true
...
if( StringFoo.Value ) //throws an exception
...
StringFoo.Value.Substring( 0, 5 ); //returns 'Stack'
BooleanFoo.Value.Substring( 0, 5 ); //throws an exception