在C#中是否可以访问仅具有属性值的类实例?

时间:2018-06-20 19:10:21

标签: c# class reflection

这可能是一个愚蠢的问题,但是有可能实现这种情况吗? 我有一个课程,例如

public class Car
{
public string Make {get;set;}
public string Model {get;set;}
public decimal Price {get;set;}
public User Owner {get;set;}
}

其中owner是其他地方的属性设置,而不是我拥有的功能

public static class Operations
    {
public static void CalculateTaxes(decimal price)
       {
           ....some code goes here and I want using reflection to access Owner,supposing that i will always pass price of a car
       }
    }

该函数将被这样调用

var car =new Car(){Price=25000,Make="BMW",Model="X6",Owner=new User(){"Sam Johnson"}};
Operations.CalculateTaxes(car.Price);

这只是一个伪造的代码,在真实的应用程序中,我不想传递整个实例,而是想要获得车主的控制权。这是一个真实的目标吗?

3 个答案:

答案 0 :(得分:2)

您的问题的答案很简短:否。 在任何情况下,这都是不可能的-因为C#的设计方式。谢谢Mads。

想象一下将整数传递给受感染的第三方库的安全隐患,并且这样做会意外泄漏用户凭据。

这里的真正问题是设计问题。 您的代码不适合您的应用程序的需求。 重新考虑您的设计。

还要注意,尽管反射有很多用例并可以实现很多功能, 在这样简单的情况下-通常是过度杀伤力。 将反射用于元编程-而不用于业务逻辑。

答案 1 :(得分:0)

使用值类型decimal不仅不能做到这一点。甚至类之类的引用类型也不起作用,因为(AFAIK)类无法跟踪指向它们的所有对象(同一类实例可以是多个所有者的属性)。

幸运的是,有一个简单的解决方案-传递汽车实例本身,并从中提取价格。

public static void CalculateTaxes(Car car)
{
    decimal price = car.Price;
    ...
}

如果需要使用Car以外的类型调用此方法,则可以创建一个适当的接口并让Car来实现它。例如具有Owner属性的接口。但是,由于您试图获得更多的汽车性能,因此我假设这将仅用于类型Car

答案 2 :(得分:0)

我想到了这个解决方案,但现在正是我想要的,因为会有很多不同类型的属性,并且每个属性都应在不同的函数中进行处理,而我想使用点符号传递它们,而不是像CalculateTax(car,"Price")

我认为,最好的解决方案将是使用局部函数,该函数可以访问整个对象,例如

public static class Operations
    {
    public static void Operate(Car car)
       {
           calculateTaxes(car.Price);
         void calculateTaxes(decimal price)
         { 
          car.Owner is accessible here 
          }

         void rateMake(string make)
         { 
          so on and so on
          }


       }

    }