Ognl表达式

  下边这段是百度对Ognl的定义:

  OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言,通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。它使用相同的表达式去存取对象的属性。

  根据这段描述可以得知,Ognl表达式允许我们使用一种统一的语法来操作对象的属性、方法等。Ognl表达式比较强大的地方在于它能链式的调用方法。什么是链式的调用方法?比如一个对象A里包含另外一个对象B,如果我们有一个A的实例,但想调用B的某个方法,该怎么办?再深入N层呢?使用Ognl可以一层层深入调用方法,只需要简洁的语法就能实现。下面来看看怎么使用Ognl表达式来操作对象的属性、方法。

  先设定两个类。

class Dog{

    public string _name;

    public int _age;

    public DogKiller dk=new DogKiller();

    public Dog(string name,int age){

        this._name = name;

        this._age = age;

    }

    public void talk(string message){

        Debug.Log(string.Format("我的名字叫{0},我今年{1}岁了,我想对你说,{2}!",_name,_age,message));

    }

}



class DogKiller{

    public void Kill(string msg){

        Debug.Log(string.Format("我是狗狗杀手,我想说:{0}!!!",msg));

    }



    public static void Threat(string msg){

        Debug.Log(string.Format("你这家伙,{0}?离我远点!",msg));

    }

}

   调用类的属性。

Dog littledog = new Dog("xiaobai",5);

//获取属性

string dogname = (string)ognl.Ognl.getValue("_name",littledog);

Debug.Log(dogname);

//输出为:xiaobai

   现在创建一个上下文对象。Ognl通过上下文来存储参数数据。假如不传入上下文,Ognl会自动创建一个默认的上下文对象。

Dictionary<string,string> context = new Dictionary<string,string>();

context.Add("msg","Hello World");

   为了访问上下文中的数据,可以在前面加上#号。

//调用方法,#msg表示访问上下文中的对象

//Ognl通过上下文(context)来处理事务,如果不传入上下文,会创建一个默认的上下文对象

//上下文通常用来存储数据

ognl.Ognl.getValue("talk(#msg)",context,littledog);

//输出为:我的名字叫xiaobai,我今年5岁了,我想对你说,Hello World!

   现在我想访问Dog里面的DogKiller属性的方法Kill(),是时候使用链式调用了。

context.Add("dk","我是一个杀手!");

//链式方法调用

ognl.Ognl.getValue("dk.Kill(#dk)",context,littledog);

//输出为:我是狗狗杀手,我想说:我是一个杀手!!!!

   那么如何调用静态方法?对于静态方法,需要传入一个类名,格式为@classname@methodname。

context.Add("threat","你不想活了吗?");

//调用静态方法需提供类名,格式为"@classname@methodname(#param)"

ognl.Ognl.getValue("@DogKiller@Threat(#threat)",context,littledog);

//输出为:你这家伙,你不想活了吗??离我远点!

   Ognl还能够创建类型实例、通过下标来访问数组等集合等其它功能。不过这些功能用的不多,更多时候还是进行调用方法、访问属性等操作,因此先掌握基本的操作,假如有其它需要再详细研究。

你可能感兴趣的:(Ognl)