无法访问受保护的成员’object.MemberwiseClone()’
我正在尝试在我的自定义类上使用.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
类?
在任何类X
,您只能在X
的实例上调用MemberwiseClone
(或任何其他受保护的方法)。 (或者从X
派生的类)
由于您尝试克隆的Enemy
类没有inheritance您尝试克隆它的GameBase
类,因此您收到此错误。
要解决此问题,请向Enemy
添加一个公共Clone
方法,如下所示:
class Enemy : ICloneable { //... public Enemy Clone() { return (Enemy)this.MemberwiseClone(); } object ICloneable.Clone() { return Clone(); } }
- 你不能直接使用MemberwiseClone(),你必须通过派生类实现它(推荐)
- 但是,通过反思,你可以欺骗它:)
-
您可以将此litle扩展用于未实现ICloneable的类:
///
/// Clones a object via shallow copy /// ///Object Type to Clone /// Object to Clone ///New Object reference public static T CloneObject(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; }
这是一个允许克隆任何对象的扩展方法(请注意它在所有情况下都不起作用)
public static class Extra_Objects_ExtensionMethods { public static T clone(this T objectToClone) { try { if (objectToClone.isNull()) "[object .clone] provided object was null (type = {0})".error(typeof(T)); else return (T)objectToClone.invoke("MemberwiseClone"); } catch(Exception ex) { "[object .clone]Faild to clone object {0} of type {1}".error(objectToClone.str(), typeof(T)); } return default(T); } }