我正在尝试在我的自定义类上使用.MemberwiseClone()
,但它会引发此错误:
Cannot access protected member 'object.MemberwiseClone()' via a qualifier of type 'BLBGameBase_V2.Enemy'; the qualifier must be of type 'BLBGameBase_V2.GameBase' (or derived from it)
这是什么意思?或者更好的是,我如何克隆Enemy
类?
答案 0 :(得分:35)
在任何类X
中,您只能在MemberwiseClone
的实例上调用X
(或任何其他受保护的方法)。 (或者来自X
)
由于您尝试克隆的Enemy
类未继承您尝试克隆它的GameBase
类,因此您收到此错误。
要解决此问题,请向Clone
添加公开Enemy
方法,如下所示:
class Enemy : ICloneable {
//...
public Enemy Clone() { return (Enemy)this.MemberwiseClone(); }
object ICloneable.Clone() { return Clone(); }
}
答案 1 :(得分:27)
您可以将此litle扩展名用于未实现ICloneable的类:
/// <summary>
/// Clones a object via shallow copy
/// </summary>
/// <typeparam name="T">Object Type to Clone</typeparam>
/// <param name="obj">Object to Clone</param>
/// <returns>New Object reference</returns>
public static T CloneObject<T>(this T obj) where T : class
{
if (obj == null) return null;
System.Reflection.MethodInfo inst = obj.GetType().GetMethod("MemberwiseClone",
System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
if (inst != null)
return (T)inst.Invoke(obj, null);
else
return null;
}
答案 2 :(得分:-1)
这是一个允许克隆任何对象的扩展方法(请注意它在所有情况下都不起作用)
public static class Extra_Objects_ExtensionMethods
{
public static T clone<T>(this T objectToClone)
{
try
{
if (objectToClone.isNull())
"[object<T>.clone] provided object was null (type = {0})".error(typeof(T));
else
return (T)objectToClone.invoke("MemberwiseClone");
}
catch(Exception ex)
{
"[object<T>.clone]Faild to clone object {0} of type {1}".error(objectToClone.str(), typeof(T));
}
return default(T);
}
}