c#.NET动态自定义控件,动态返回类型

时间:2014-11-26 12:48:31

标签: c# .net controls

这就是我想要实现的目标:

我们创建了自己的实体框架,并将实体对象传递给自定义控件。基于类型(字符串,布尔值,...)和我们想要在页面上创建控件的权限不同。

例如:

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。  这有可能吗?如果可以,我该怎么做? (我听说过有关反射的事情,但我不确定如何给出一个多重回归类型的可能性)

1 个答案:

答案 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