【问题标题】:.NET any class inherits from Object but cannot access MemberwiseClone() method.NET 任何类都继承自 Object 但无法访问 MemberwiseClone() 方法
【发布时间】:2017-08-10 12:02:31
【问题描述】:

试图写一个通用的 Duplicate 扩展方法,我发现 MemberwiseClone() 是不可访问的。

public static T Duplicate<T>(this T original) where T : class
{
    T result = (T) original.MemberwiseClone();

}

编译器拒绝方法的唯一行。 Microsoft 在 Object 类文档中显示了该方法。此外,在 NET 中,程序员定义的任何类都隐式继承自 Object。 怎么回事? 任何帮助将不胜感激。

【问题讨论】:

  • 此方法受保护。 msdn.microsoft.com/pt-br/library/…
  • 编译器没有说“rejected”,它给你一个非常具体的错误信息“Cannot access protected member 'object.MemberwiseClone()' via a qualifier of type 'object'; the qualifier must属于“X”类型(或派生自它)”。 “无法访问protected”部分是解释,受保护的方法只能访问inside类或后代类,不能从外部访问。
  • 但是如果每个类都继承自Object,并且是受保护的方法,为什么不能访问它呢?注意我说 T 必须是类,所以继承是有保证的。

标签: .net c#-4.0


【解决方案1】:

这个方法是受保护的,所以你只能在类范围内访问它。

见:

MSDN:

protected object MemberwiseClone()

【讨论】:

  • 对不起。在我的问题中,我说该方法受到保护。但是 asa 说,如果每个类都继承自 Object,我看不出编译器错误的原因。你的回答并不能解释我的问题。
  • 对不起@Marcelo,我看不到你告诉你的方法是受保护的。我认为您不完全了解受保护的修饰符的真正作用。在 C# 中,受保护的方法在类范围之外是不可访问的。见:docs.microsoft.com/pt-br/dotnet/csharp/language-reference/…
【解决方案2】:

解决办法

    public static T Duplicate<T>( this T source )
    {
        Type OfT = typeof(T);
        T result = (T) OfT.GetConstructor(System.Type.EmptyTypes).Invoke(null);

        FieldInfo[] objectFields = OfT.GetFields( BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance 
                                                    | BindingFlags.FlattenHierarchy );

        foreach (FieldInfo fi in objectFields) {
            if (fi.FieldType == typeof(string)) {
                string sourcestring = (string)fi.GetValue(source);
                fi.SetValue(result, new string(sourcestring.ToCharArray()));
            }
            else 
                fi.SetValue(result, fi.GetValue(source));
        }

        return result;
    }    

当然,你的类必须有一个无参数的构造函数。就我而言,我需要复制字符串。对于更一般的情况,可以添加一个布尔参数来控制字符串的复制位置或简单地引用原始字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-29
    • 2021-10-16
    • 1970-01-01
    相关资源
    最近更新 更多