簡體   English   中英

在C#中是否可以訪問僅具有屬性值的類實例?

[英]Is it possible in c# to access class instance having only property value?

可能這是一個愚蠢的問題,但是有可能實現這種情況嗎? 我有一個課,例如

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

其中所有者是其他地方的屬性設置,而不是我有一個功能

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);

這只是一個偽造的代碼,在真實的應用程序中,我不想傳遞整個實例,但想要獲得車主的控制權,這是一個真正的目標嗎?

您的問題的答案很簡單而且很簡短:不。在任何情況下,這都是不可能的,因為C#是如何設計的。 謝謝Mads。

想象一下將整數傳遞給受損的第三方庫的安全隱患,並且這樣做會意外泄漏用戶憑據。

這里真正的問題是設計問題。 您的代碼不適合您的應用程序的需求。 重新考慮您的設計。

還要注意,盡管反射有很多用例,並且可以實現很多功能,但是在這種簡單的情況下,反射通常是多余的。 將反射用於元編程-而不用於業務邏輯。

不僅不能用作為值類型的decimal來完成。 甚至類之類的引用類型也不起作用,因為(AFAIK)類無法跟蹤指向它們的所有對象(同一類實例可以是多個所有者的屬性)。

幸運的是,有一個簡單的解決方案-傳遞汽車實例本身,並從中提取價格。

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

如果需要使用Car以外的類型調用此方法,則可以創建一個適當的接口並讓Car實現它。 例如具有Owner屬性的接口。 但是,由於您試圖獲得更多的汽車屬性,因此我假設這將僅用於Car類型。

我想到了該解決方案,但現在正是我想要的,因為會有很多不同類型的屬性,並且每個屬性都應在不同的函數中進行處理,而我想使用點表示法傳遞它們,而不是像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
          }


       }

    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM