根据VS2010注释,由于我的VS2010是英文版的,这里就不贴出英文注释了。简单介绍一下如何使用这个方法:假设我们一个类OurClass它继承了DynamicObject 这个Class。OurClass中有一个方法OurMethod()。接着在OurClass 类中 重写 TryInvokeMember这个基类虚方法。以上设置完后以后只要OurClass 的OurMethod方法一旦被调用都先执行一下重写后的
TryInvokeMember()方法。也许您会问这样到底有何用途?OK!请先看javascript这段代码片段:
function tryInvokeMember(obj) {
if (obj && typeof obj.ourMethod === "function") {
return obj.ourMethod();
}
alert('未找到!');
return null;
}
var ourObj1 = {};
ourObj1.Method = function () {
alert('111');
};
var ourObj2 = {};
ourObj2.ourMethod = function () {
alert('已经找到ourMethod并且执行');
};
tryInvokeMember(ourObj1);
tryInvokeMember(ourObj2);
if (obj && typeof obj.ourMethod === "function") {
return obj.ourMethod();
}
alert('未找到!');
return null;
}
var ourObj1 = {};
ourObj1.Method = function () {
alert('111');
};
var ourObj2 = {};
ourObj2.ourMethod = function () {
alert('已经找到ourMethod并且执行');
};
tryInvokeMember(ourObj1);
tryInvokeMember(ourObj2);
大家读完这段js代码后应该会明白为什么我要重点讨论C#4.0中的DynamicObject了吧?真正的目的就是:在DuckType 类(鸭子) 方法(鸭子叫)执行之前,我们要判断对象的类是否是具备鸭子叫的功能?如果不具备就不应该执行,否则程序势必会抛出异常。C#中如何实现呢?步骤如下:
1、建立DynamicAnimal 类继承DynamicObject类,并且重写TryInvokeMember虚方法:
public class DynamicAnimal : DynamicObject {
public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
{
bool success = base.TryInvokeMember(binder, args, out result);
//如果方法不存在,请将result 这个out参数赋值为null
if (!success)
result = null;
//如果这个地方返回false 将会引发异常
return true;
}
}
public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
{
bool success = base.TryInvokeMember(binder, args, out result);
//如果方法不存在,请将result 这个out参数赋值为null
if (!success)
result = null;
//如果这个地方返回false 将会引发异常
return true;
}
}
2、建立两个DuckType类,分别为Duck 和 Human:
public class Duck : DynamicAnimal
{
public string Quack()
{
return "鸭子嘛,就Quack吧!";
}
}
public class Human : DynamicAnimal
{
public string Talk()
{
return "人类是用Talk,而不是Quack";
}
}
{
public string Quack()
{
return "鸭子嘛,就Quack吧!";
}
}
public class Human : DynamicAnimal
{
public string Talk()
{
return "人类是用Talk,而不是Quack";
}
}
3、在Console 内 建立DuckType的调用方法:
public static string DoQuack(dynamic animal)
{
string result = animal.Quack();
return result ?? "...人类当然不会鸭叫...";
}
{
string result = animal.Quack();
return result ?? "...人类当然不会鸭叫...";
}
4、Console 内 Main方法调用:
static void Main(string[] args)
{
var duck = new Duck();
var cow = new Human();
Console.WriteLine("鸭子是Quack");
Console.WriteLine(DoQuack(duck));
Console.WriteLine("人类是talk");
Console.WriteLine(DoQuack(cow));
Console.ReadKey();
}
{
var duck = new Duck();
var cow = new Human();
Console.WriteLine("鸭子是Quack");
Console.WriteLine(DoQuack(duck));
Console.WriteLine("人类是talk");
Console.WriteLine(DoQuack(cow));
Console.ReadKey();
}
程序执行结果如下:
您是否对.Net4.0 Dynamic 这个动态类型有了一个新的认识呢?