【发布时间】:2012-06-08 02:48:19
【问题描述】:
我正在尝试创建一个用于序列化对象的实用程序函数, 通常,序列化会发生如下:
[Serializable]
public CoolCat : ISerializable
{
public string Name;
public void CoolCar(SerializationInfo info, StreamingContext context)
{
Name = (string)info.GetValue("Name", typeof(string));
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("Name", Name);
}
}
但是,我希望能够做到以下几点:
[Serializable]
public CoolCat : ISerializable
{
public string Name;
public void CoolCar(SerializationInfo info, StreamingContext context)
{
Name = info.GetValue<string>(() => Name);
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue<string>(() => Name);
}
}
我使用以下两种方法:
这个用于反序列化值:
public static T GetValue<T>(this SerializationInfo Source, Expression<Func<T>> MemberExpression)
{
string Name = ((MemberExpression)MemberExpression.Body).Member.Name;
return (T)Source.GetValue(Name, typeof(T));
}
还有这个用于序列化值:
public static void AddValue<T>(this SerializationInfo Source, Expression<Func<T>> MemberExpression)
{
MemberExpression Body = MemberExpression.Body as MemberExpression;
if (Body == null)
{
UnaryExpression UnaryBody = MemberExpression.Body as UnaryExpression;
if (UnaryBody != null)
{
Body = UnaryBody.Operand as MemberExpression;
}
else
{
throw new ArgumentException("Expression is not a MemberExpression", "MemberExpression");
}
}
string Name = Body.Member.Name;
if (Body.Member is FieldInfo)
{
T Value = (T)((FieldInfo)Body.Member).GetValue(((ConstantExpression)Body.Expression).Value);
Source.AddValue(Name, Value, typeof(T));
}
else if (Body.Member is PropertyInfo)
{
T Value = (T)((PropertyInfo)Body.Member).GetValue(((ConstantExpression)Body.Expression, null);
Source.AddValue(Name, Value, typeof(T));
}
else
{
throw new ArgumentException("Expression must refer to only a Field or a Property", "MemberExpression");
}
}
当我尝试从 Body.Member 作为属性时获取值时遇到异常(当它是字段时,它工作正常)。我怎样才能得到这个?
其他问题 - 1)我采用的方法有什么问题吗? 2)有没有更好的方法来处理这件事? 3) Body.Member什么时候是FieldInfo,什么时候是PropertyInfo?
这是我之前的问题Here的延伸
【问题讨论】:
-
“我在尝试时遇到异常”是什么异常?
-
我只是把它分解了一点,当我将对象值强制转换为 T 时发生异常 - 所以它实际上是让我从 PropertyInfo 中获取值,但我怎样才能将它强制转换为正确的返回类型?
标签: c# serialization reflection