我正在尝试开发一种方法,在actionscript中以class对象为参数,并在运行时生成该类的实例:
public function getComponent(componentType:Class):Object
{
return new componentType();
}
在某些情况下,传递给我的可能是一个代表接口的Class对象。当然,我不能直接创建接口的实例。
是否有一些方法来查询类对象,并确定它是否代表一个接口,以便我可以避免尝试以这种方式创建一个实例?
假设您遵循接口类的命名约定,如在标准IInterfaceName
中,接口名称的前缀为大写字母后面的大写"I"和类名称的其余部分。有几种方法可以做到这一点。如果你有很多不同的接口可以作为参数传递,你可以这样做:
首先导入flash.utils.getQualifiedClassName
,在您的函数中:
public function getComponent(componentType:Class):Object
{
var name:String = getQualifiedClassName( componentType ).replace(/.*:+/g,"");
if ( name.search( /^I[A-Z]/g ) != -1 ) {
trace( "parameter is an interface!" );
return null;
}
return new componentType();
}
您不必设置name变量,但这有助于使搜索更严格一些。你可以这样做:
if ( getQualifiedClassName( componentType ).search( /I[A-Z]/g ) != -1 ) {
trace( "parameter is an interface!" );
return null;
}
如果您不知道,getQualifiedClassName
返回类名的字符串格式。正则表达式专门检查大写IInterfaceName样式的字符串
最后,如果你知道它只有一个接口,你可以简单地这样做:
if ( componentType == IMyinterface ) {
trace( "component is a IMyinterface" );
}
经过仔细的尝试和错误,我想出了以下函数:
public static function isInterface(clazz:Class):Boolean
{
return describeType(clazz).factory.extendsClass.(@type=="Object").length()==0;
}
有谁知道这个条件是否总是适用于所有actionscript接口?
我想这对你会有用的:
getQualifiedSuperclassName(classObject);
如果传递一个接口,这将返回null,因为接口没有父类。它总是会给你任何类型的类的结果,因为每个类基本上都是一个对象:)
无论如何,我不认为传递这样的混合值函数是一个好主意;)检查课程是否以"I"开头更糟糕(对不起,Bennett:))
注。记住,描述类型是非常慢的!