using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Test
{
public class Program
{
static void Main(string[] args)
{
new ClassA<Object>().run();
}
}
public class ClassA<T> {
public int _int = 10;
public ClassA<T> val { get; set; }
public void run()
{
this.val = this;
Class<T>.Instance.setDga<T>(this.func);
var type = typeof(ClassA<T>);
var proInfo = type.GetProperty("val");
var getVal = proInfo.GetGetMethod().Invoke(this, new object[] {});
Console.WriteLine("call with getVal");
Class<T>.Instance.Trans(getVal);
Class<T>.Instance.Trans(getVal);
Console.WriteLine("");
Console.WriteLine("call with val");
Class<T>.Instance.Trans(val);
Class<T>.Instance.Trans(val);
Console.WriteLine("");
Console.WriteLine("compare val and getVal: \r\n " +
"==:{0} \r\n " +
"equals:{1} \r\n " +
"refEquals:{2} \r\n " +
"getVal{3} \r\n " +
"val:{4} \r\n" +
"type==:{5}",
getVal == val, val?.Equals(getVal), ReferenceEquals(getVal, val),
((ClassA<T>)getVal)._int, val._int,
getVal.GetType() == val.GetType());
Console.ReadKey();
}
public void func(T handler) {
Console.WriteLine("success call func! handler:{0}", handler);
}
}
public class Class<T>
{
private static Class<T> _instance;
public static Class<T> Instance {
get {
if(_instance == null)
_instance = new Class<T>();
return _instance;
}
}
public delegate void Handler<Tm>(Tm message);
private Delegate dga;
public void setDga<Tm>(Handler<Tm> handler)
{
dga = handler;
}
public void Trans<Tm>(Tm obj)
{
var t1 = dga as Handler<Tm>;
if (t1 != null) t1(obj);
Console.WriteLine("result:{0}", t1);
}
}
}
下面是输出结果:
call with getVal
success call func! handler:Test.ClassA`1[System.Object]
result:Test.Class`1+Handler`1[System.Object,System.Object]
success call func! handler:Test.ClassA`1[System.Object]
result:Test.Class`1+Handler`1[System.Object,System.Object]
call with val
result:
result:
compare val and getVal:
==:True
equals:True
refEquals:True
getVal10
val:10
type==:True
我不能理解为什么:`Class<T>.Instance.Trans(val);`调用的`dga as Handler<Tm>;`会失败。
因为classA的实例val和classA的属性val返回的是两个不同的对象,即使它们的值相同,在.net框架内都是两个不同的对象,因此Class.Instance.Trans(val);用val作为参数传入,而Class.Instance.Trans(getVal);用getVal作为参数传入,分别根据调用类型转换函数转换成不同的类型,所以结果完全不同。