无法访问受保护的成员'object.MemberwiseClone()'

时间:2010-01-07 19:55:19

标签: c# clone

我正在尝试在我的自定义类上使用.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类?

3 个答案:

答案 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)

  • 你不能直接使用MemberwiseClone(),你必须通过派生类实现它(推荐)
  • 但是,通过反思,你可以欺骗它:)
  • 您可以将此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);
    }   
}