如何在 windows 8.1 通用应用程序中创建克隆对象?
How to create a clone object in windows 8.1 universal app?
我正在将我的应用程序从 Windows Phone 8 迁移到 Windows 通用应用程序。我的要求是从现有对象创建一个克隆对象。我曾经在 Windows Phone 8
中用下面的代码做同样的事情
public static object CloneObject(object o)
{
Type t = o.GetType();
PropertyInfo[] properties = t.GetProperties();
Object p = t.InvokeMember("", System.Reflection.BindingFlags.CreateInstance,
null, o, null);
foreach (PropertyInfo pi in properties)
{
if (pi.CanWrite)
{
pi.SetValue(p, pi.GetValue(o, null), null);
}
}
return p;
}
任何人都可以建议,我怎样才能在 Windows 通用应用程序中实现这一点,因为像 InvokeMemeber 这样的一些方法不可用。
您需要使用重构的反射 API:
using System.Reflection;
public class Test
{
public string Name { get; set; }
public int Id { get; set; }
}
void DoClone()
{
var o = new Test { Name = "Fred", Id = 42 };
Type t = o.GetType();
var properties = t.GetTypeInfo().DeclaredProperties;
var p = t.GetTypeInfo().DeclaredConstructors.FirstOrDefault().Invoke(null);
foreach (PropertyInfo pi in properties)
{
if (pi.CanWrite)
pi.SetValue(p, pi.GetValue(o, null), null);
}
dynamic x = p;
// Important: Can't use dynamic objects inside WriteLine call
// So have to create temporary string
String s = x.Name + ": " + x.Id;
Debug.WriteLine(s);
}
省略了缺少默认构造函数等错误处理
我正在将我的应用程序从 Windows Phone 8 迁移到 Windows 通用应用程序。我的要求是从现有对象创建一个克隆对象。我曾经在 Windows Phone 8
中用下面的代码做同样的事情public static object CloneObject(object o)
{
Type t = o.GetType();
PropertyInfo[] properties = t.GetProperties();
Object p = t.InvokeMember("", System.Reflection.BindingFlags.CreateInstance,
null, o, null);
foreach (PropertyInfo pi in properties)
{
if (pi.CanWrite)
{
pi.SetValue(p, pi.GetValue(o, null), null);
}
}
return p;
}
任何人都可以建议,我怎样才能在 Windows 通用应用程序中实现这一点,因为像 InvokeMemeber 这样的一些方法不可用。
您需要使用重构的反射 API:
using System.Reflection;
public class Test
{
public string Name { get; set; }
public int Id { get; set; }
}
void DoClone()
{
var o = new Test { Name = "Fred", Id = 42 };
Type t = o.GetType();
var properties = t.GetTypeInfo().DeclaredProperties;
var p = t.GetTypeInfo().DeclaredConstructors.FirstOrDefault().Invoke(null);
foreach (PropertyInfo pi in properties)
{
if (pi.CanWrite)
pi.SetValue(p, pi.GetValue(o, null), null);
}
dynamic x = p;
// Important: Can't use dynamic objects inside WriteLine call
// So have to create temporary string
String s = x.Name + ": " + x.Id;
Debug.WriteLine(s);
}
省略了缺少默认构造函数等错误处理