我正在尝试使用我.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)
Run Code Online (Sandbox Code Playgroud)
这是什么意思?或者更好的是,我如何克隆一个Enemy类?
SLa*_*aks 37
在任何类中X,您只能MemberwiseClone在实例上调用(或任何其他受保护的方法)X.(或从中派生的类X)
由于Enemy您尝试克隆的GameBase类不会继承您尝试克隆它的类,因此您会收到此错误.
要解决此问题,请添加一个公共Clone方法Enemy,如下所示:
class Enemy : ICloneable {
//...
public Enemy Clone() { return (Enemy)this.MemberwiseClone(); }
object ICloneable.Clone() { return Clone(); }
}
Run Code Online (Sandbox Code Playgroud)
Mod*_*dMa 28
您可以将此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;
}
Run Code Online (Sandbox Code Playgroud)