📄 memberinvoker.cs
字号:
using System;
using System.Xml;
using System.Reflection;
using System.Diagnostics;
using System.ComponentModel;
using System.Collections;
namespace gowk.GXF
{
/// <summary>
/// MemberInvoker 的摘要说明。
/// </summary>
internal class MemberInvoker:MemberInvokerBase
{
public MemberInvoker()
{
}
public override object GetValue(object obj, string men,ParserState state)
{
return this.GetValue(obj,this.GetTypeMemberInfo(obj.GetType(),men),state);
}
public override object GetValue(object obj,MemberInfo men,ParserState state)
{
if(men is FieldInfo)
{
FieldInfo fi=(FieldInfo)men;
return this.GetValue(obj,fi,state);
}
else if(men is PropertyInfo)
{
PropertyInfo pi=(PropertyInfo)men;
return this.GetValue(obj,pi,state);
}
throw(new System.NotSupportedException());
}
public override object GetValue(object obj, FieldInfo men,ParserState state)
{
return men.GetValue(obj);
}
public override object GetValue(object obj, PropertyInfo men,ParserState state)
{
return men.GetValue(obj,null);
}
public override bool SetValue(object obj, string men, object value,ParserState state)
{
return this.SetValue(obj,this.GetTypeMemberInfo(obj.GetType(),men),value,state);
}
public override bool SetValue(object obj,MemberInfo men,object value,ParserState state)
{
if(men is FieldInfo)
{
FieldInfo fi=(FieldInfo)men;
return this.SetValue(obj,fi,value,state);
}
else if(men is PropertyInfo)
{
PropertyInfo pi=(PropertyInfo)men;
return this.SetValue(obj,pi,value,state);
}
else if(men is EventInfo)
{
Debug.Assert(state.Instance!=null);
object instance=state.Instance;
System.Delegate dlgt=null;
EventInfo ei=(EventInfo)men;
if(value is System.Delegate)
{
dlgt=(System.Delegate)value;
}
else if(value is string)
{
Type t=instance.GetType();
try
{
dlgt=System.Delegate.CreateDelegate(ei.EventHandlerType,instance,(string)value,true);
}
catch(System.Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.Message);
}
}
if(null!=dlgt)
ei.AddEventHandler(obj,dlgt);
}
return false;
}
public override bool SetValue(object obj, FieldInfo men, object value,ParserState state)
{
/* TypeConverter tc = TypeDescriptor.GetConverter(men.FieldType);
if(tc.CanConvertFrom(value.GetType()))
{
object ov=tc.ConvertFrom(value);
men.SetValue(obj,ov);
return true;
}
else
{
tc=TypeDescriptor.GetConverter(value.GetType());
if(tc.CanConvertTo(men.FieldType))
{
men.SetValue(obj,tc.ConvertTo(value,men.FieldType));
return true;
}
}
return false;*/
try
{
men.SetValue(obj,value);return true;
}
catch
{
return false;
}
}
public override bool SetValue(object obj, PropertyInfo men, object value,ParserState state)
{
/* TypeConverter tc = TypeDescriptor.GetConverter(men.PropertyType);
if(tc.CanConvertFrom(value.GetType()))
{
object ov=tc.ConvertFrom(value);
men.SetValue(obj,ov,null);
return true;
}
else
{
tc=TypeDescriptor.GetConverter(value.GetType());
if(tc.CanConvertTo(men.PropertyType))
{
men.SetValue(obj,tc.ConvertTo(value,men.PropertyType),null);
return true;
}
}*/
try
{
men.SetValue(obj,value,null);return true;
}
catch
{
return false;
}
}
protected internal MemberInfo GetTypeMemberInfo(Type t,string men)
{
MemberInfo[] infos=t.GetMember(men,BindingFlags.Public|BindingFlags.Instance);
return infos.Length>0?infos[0]:null;
}
protected internal FieldInfo GetTypeFieldInfo(Type t,string men)
{
return t.GetField(men);
}
protected internal PropertyInfo GetTypePropertyInfo(Type t,string men)
{
return t.GetProperty(men);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -