.NET任何类都继承自对象,但无法访问MemberwiseClone()方法

.NET任何类都继承自对象,但无法访问MemberwiseClone()方法,.net,c#-4.0,.net,C# 4.0,尝试编写通用的重复扩展方法时,我发现MemberwiseClone()不可访问 public static T Duplicate<T>(this T original) where T : class { T result = (T) original.MemberwiseClone(); } publicstatict-Duplicate(这是T-original),其中T:class { T result=(T)original.MemberwiseClone();

尝试编写通用的重复扩展方法时,我发现MemberwiseClone()不可访问

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

}
publicstatict-Duplicate(这是T-original),其中T:class
{
T result=(T)original.MemberwiseClone();
}
编译器拒绝方法的唯一行。 Microsoft在对象类文档中显示了该方法。此外,在NET中,程序员定义的任何类都隐式地从对象继承。 怎么回事?
任何帮助都将不胜感激。

此方法受保护,因此您只能在类范围内访问它

见:

这是解决办法

    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;
    }    
公共静态T复制(此T源)
{
类型OfT=类型OF(T);
T result=(T)OfT.GetConstructor(System.Type.EmptyTypes.Invoke(null);
FieldInfo[]objectFields=OfT.GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance
|BindingFlags(层次结构);
foreach(objectFields中的FieldInfo fi){
if(fi.FieldType==typeof(string)){
string sourcestring=(string)fi.GetValue(source);
fi.SetValue(结果,新字符串(sourcestring.ToCharArray());
}
其他的
fi.SetValue(结果,fi.GetValue(源));
}
返回结果;
}    

当然,类必须具有无参数构造函数。在我的例子中,我需要复制字符串。对于更一般的情况,可以添加一个布尔参数来控制字符串的复制位置,或者只引用原始字符串。

此方法受保护。编译器没有说“已拒绝”,它会给您一条非常具体的错误消息“无法通过“object”类型的限定符访问受保护的成员“object.MemberwiseClone()”;限定符必须是“X”类型(或从中派生)。“不能访问受保护的”部分是解释,受保护的方法只能在类或子类内部访问,不能从外部访问。但是如果每个类都继承自对象,并且是受保护的方法,为什么不能访问它?注意,我声明T必须是类,所以继承是有保证的。对不起。在我的问题中,我声明该方法是受保护的。但asa说,如果每个类都从Object继承,我看不出编译器出错的原因。你的回答并不能解释我的问题。抱歉@Marcelo,我看不出你在哪里告诉你知道该方法是受保护的。我想你还没有完全理解受保护修改器的真正作用。在C#中,受保护的方法不能在类范围之外访问。见:
    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;
    }