簡體   English   中英

沒有公共基類的泛型訪問屬性

[英]Access Property of Generic without common base class

我有一個庫的兩個獨立類,它們沒有相同的基類,我也不能更改這些類的實現。

想象一下這些類是這樣的:

public class A {
     public int X { get; } = 1;
}

public class B {
     public int X { get; } = 2;
}

現在我想創建一個泛型類,它要么依賴於A要么依賴於B並在那里訪問X的值。

所以我做了:

public class GenericClass<T> 
    /*where T : ?*/
{
    void Foo(T t) {
        int x = t.X; // is this possible and how? 
    }
}

如果我自己實現AB ,我會定義一個實現屬性X的接口,但我不能這樣做。 在不改變A類和BA情況下,有沒有其他方法可以說通用T具有屬性X
另一個想法是創建AB子類,然后實現上述接口,但我想避免這種情況。

您可以重載Foo以獲取AB

void Foo(A t)
{
  int x = t.X;
}

void Foo(B t)
{
  int x = t.X;
}

如果您想為每個可能具有X屬性的類執行此操作,那么您將需要一個基於反射的解決方案。 例如:

void Foo(object obj)
{
  var property = obj.GetType().GetProperty("X");
  if(property == null) throw new Exception();

  int x = (int)property.GetValue(obj);
}

注意:我已經最小化了這里的錯誤處理。 您需要處理屬性可能沒有 getter(罕見)或不返回int

如果類的數量是可管理的,那么您可以使用該屬性創建一個接口,派生一個新類並實現該接口,這不需要更改。 例如:

interface IMyStuff
{
  int X{get;}
}

class MyA : A, IMyStuff
{
}

class MyB : B, IMyStuff
{
}

不是你可以讓 Foo 接受接口:

void Foo(IMyStuff stuff)
{
  int x = stuff.X
}

另一種選擇是使用dynamic

dynamic d;
d = t;         // here t can be an instance of A, or or B, or of anything that has X
int x = d.X;

dynamic本質上實現了“鴨子類型”:如果dynamic對象g具有屬性X ,則gX將檢索它。 這是手動實現反射的替代方法。

暫無
暫無

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

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