我们都知道匿名类的定义可以用属性,如:
var obj = new { Name = "crab", Age = 23 };
那么我们如何在匿名类中定义方法呢?就像JAVA中可以对匿名类定义匿名方法。
首先我想到了委托,
定义一个委托 public delegate string SayHelloHandler( string name );
然后定义一个与该委托相同方法签名的方法
public string MySayHello( string name ) { return string.Format( "Hello, {0}!", name ); }
最后定义匿名类
var obj = new { Name = "crab", Age = 23
, SayHello = new SayHelloHandler( MySayHello ) };
调用方法:obj.SayHello( "nanhuacrab" );
经测试这是一种可行的方案。
接着我想到了匿名方法,
var obj = new { Name = "crab", Age = 23
, SayHello = delegete( string name ) { return string.Formate( "Hello, {0}!", name ); } };
经测试此方案不行。
最后想到了Lambda表达式,
var obj = new { Name = "crab', Age = 23
, SayHello = (name) => { return string.Formate( "Hello, {0}!", name ); } };
经测试此方案也不行。
如果我想实现类似JAVA中匿名类也可以定义匿名方法的功能,除了委托还有其它的方法吗?如果以上有什么地方写错了,请高手指教。
using System.Collections.Generic;
using System;
class P
{
delegate string X(string name);
static void Main()
{
var obj = new { Name = "crab",
Age = 23,
SayHello = (X)((string name) => string.Format( "Hello, {0}!", name ))
};
}
}
现在来看只有委托,似乎没有别的方法了
虽说还能先生成对象,再针对这个对象使用EMIT等动态生成新类,再将对象转成新的类以加上方法,但我想不是变态就不会用这种方案吧
不错啊。你可以继续下一步了。