.NET任何类都继承自对象,但无法访问MemberwiseClone()方法
尝试编写通用的重复扩展方法时,我发现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();
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;
}