【发布时间】:2015-03-05 13:14:32
【问题描述】:
我有一个递归深拷贝函数来创建对象的新实例。为了提高我的函数的功能,我想在我的对象中的某些值上放置某种<noCopy> 自定义属性,以防止它们被复制
要复制的对象可能如下所示:
public Class CDatabase
public var1 as double
private var2 as CSomeObject
<noCopy> private var3 as double
<noCopy> private var4 as CSomeObject
...
end class
我的递归函数如下所示:
public shared Function Copy(originalObject as Object) as Object
if originalObject = nothing then
return nothing
end if
if Attribute.IsDefined(originalObject.GetType, GetType(NoCopy)) 'This does not work
return nothing
end if
~ do other recursive stuff ~
return cloned object
end function
我的属性定义如下:
<System.AttributeUsage(System.AttributeTargets.All)>
Public Class NoCopy
Inherits System.Attribute
End Class
我这样调用我的克隆函数:
public Class Example
dim original as Database
dim clone as Database
clone = original.Copy
'This one returns true
Dim test As Boolean = Attribute.IsDefined(original.GetType.GetMember("var3")(0), GetType(NoCopy))
end class
当我尝试获取originalObject 的属性时,我总是得到一个错误的返回值。但是,当我通过直接引用对象来执行此操作时,我会得到肯定的结果。
【问题讨论】:
-
AutoMapper处理这种事情。 -
如果将
NoCopy应用于字段,则无法检查属性的类型(类)。 -
正如我所说,复制功能递归地工作。它得到一个
object_1并将object_1中包含的任何对象传递给它自己,直到它遇到不能分解成更小的部分的原始类型。每次传递的对象都会检查 ist 属性。 -
仍然,如果你想在Type上找到属性,你需要将它应用到Type上。示例类本身没有该属性,因此标记为
does not work的代码是正确的:CDatabase类型没有应用该属性。 -
很抱歉,我只见树木不见森林。如何访问我的复制函数中的对象以获取它们的属性?我在 Google 或 MSDN 上找到的每个页面都只告诉我如何检查其他对象中的成员/属性。我真的坚持这一点:-/
标签: vb.net object reflection custom-attributes deep-copy