C# 获取自己的属性/反射?

C# 获取自己的属性/反射?,c#,C#,我寻找一种在属性中获得自己属性的方法 让我来演示我正在搜索的内容 我想使用float/double值的属性来提供比较的容差 e、 g 从另一个类我会使用 PropertyInfo propertyInfo = someobject.GetType().GetProperty("SomeProperty"); if (null != propertyInfo) { Attribute attribute = Attribute.GetCustomAttribute(propertyInfo

我寻找一种在属性中获得自己属性的方法

让我来演示我正在搜索的内容

我想使用float/double值的属性来提供比较的容差

e、 g

从另一个类我会使用

PropertyInfo propertyInfo = someobject.GetType().GetProperty("SomeProperty");
if (null != propertyInfo)
{
    Attribute attribute = Attribute.GetCustomAttribute(propertyInfo, typeof (FieldAttribute));
    FieldAttribute fieldAttribute = attribue as FieldAttribute;
    return fieldAttribute.CompareTolerance;
}


...
所以最后我只需要

if(Math.Abs(someProperty - value) < someobject.CompareTolerance("SomeField")) ... values are equal
if(Math.Abs(someProperty-value)

但是有没有一种方法可以在不每次使用反射的情况下获取属性中的atribute(this.compareTorelerance(“SomeField”)

除了生成代码之外,没有其他方法可以绕过反射。 您可以考虑一个生成具有类的定义的类,它定义了希望的GETTE/SETER(可能需要放置在部分方法)代码中,然后从属性中提取具有反射的值。然后重新编译


我不知道为什么最近每个人似乎都在避免生成代码。T4在现代版本的VS中使这成为一种乐趣。

实际上并非如此。在我看来,您必须在属性中针对某个属性进行明确编码是愚蠢的。不要将常量写入属性,而是将其写入必须编写的代码中。如果你想通过一个属性拥有它,你可以走AOP路线,使用类似Postsharp的东西。在那里,您可以创建一个属性,该属性将在编译时注入适当的代码,这样就不需要反射。如果操作正确,也不需要在属性中进行特殊编码。我不仅希望在属性中使用它,还希望在其他可能与属性进行比较的类中使用它。仅为一个值定义一次公差之类的内容,并在不同的位置使用公差(例如,将某个内容与属性进行比较,但不设置它),两次使用该值对我来说似乎是一个错误源。您永远不会知道或注意到有人更改了属性,但更改了setter,或者更改了setter,但更改了属性。如果您创建了第二个类,其中所有公差都是static/const,那么这个概述就丢失了。那么我想说,该属性返回的类型不再是float了。它是一种新类型,表示浮点、其公差和正确的比较方法。不适用。属性从ORM中使用。因此,该属性既不能增强为具有其他方法,也不能增强为不受支持的类型。即使您考虑了几百个属性,并且总是转换到变量中存储的内容(在这种情况下,属性的设置者永远不需要使用tolerence和Comparison方法设置对象,因为这是固定的部分)这看起来像是一个更高的重载,如果你说其他人可能会使用它,那么简单地为float使用一个变量来简化编码,就会破坏该属性行为,因为保存properties值的变量将不再具有该属性。但您似乎有一个特定的案例需要一些非常具体的解决方案,因此您至少应该在问题中提及上下文以获得有用的答案。生成问题:一些/许多(根据询问的对象)属性需要特殊处理(例如,检查特殊日期),因此,自动生成类似乎会破坏添加的内容。我不认为有什么东西像“属性的部分设置器”(如果一个proeprity被更改,则考虑更新情况。这就是部分类的用途。您将生成的代码放在一个单独的文件中,将手工编写的部分放在另一个文件中。查看“部分类”和“部分方法”。我将使用一些链接编辑我的答案。如果您生成代码,然后需要对一个属性应用特殊的内容,则下次创建时您将覆盖更改(例如,您将一个属性添加到边界(或此处添加要比较的dif值),或进行特殊格式更改以适应数据库方案中的数据或…).关于部分方法:如果你有一个属性,你有:a)一个返回其他内容然后无效的方法-这对于部分方法是禁止的。b) 一种非私有的方法-禁止使用部分方法。两者都不允许使用局部方法。因此,我认为c#中不存在部分属性。那么使用虚拟自动属性的基本抽象类,然后为具有所需属性的道具生成覆盖呢。我无法为您设计一个完整的解决方案,但我认为您有工具使其适合您的特定场景
if(Math.Abs(someProperty - value) < someobject.CompareTolerance("SomeField")) ... values are equal