我有一個帶有屬性 AA 的類 A 和一個帶有屬性 BB 的類 B 兩者都實作了強制 IC.C 屬性的 IC 介面,但沒有 AA 或 BB
我想要一個接收 A 或 B 的實體作為引數并可以訪問這些屬性的方法,例如:
void MyMethod(IC obj)
{
if (obj.GetType().Name.Equals("A"))
{
var v = obj.A; // some code for access the property
}
}
那可能嗎?而且,這是個好主意嗎?謝謝!
已編輯:按照@dmedine 的建議將介面重命名為 IC。
uj5u.com熱心網友回復:
最好的方法取決于您要執行的操作的具體情況,但這里有 2 個選項:
模式匹配
void MyMethod(C obj)
{
if (obj is A objAsA)
{
var vA = objAsA.A;
}
if (obj is B objAsB)
{
var vB = objAsB.B;
}
}
反射
void MyMethod(C obj)
{
var objType = obj.GetType();
if (objType.Name.Equals("A"))
{
var prop = objType.GetProperty("A");
var v = prop.GetValue(obj, null);
}
}
uj5u.com熱心網友回復:
在我看來,這樣做在某些情況下很有用。例如,如果您有一堆從介面繼承的物件IC(總是以 I 開頭的介面名稱),它們具有相似但也獨特的屬性/方法(等不及評論滾動)。您可以使用 測驗繼承的類的型別is。例如,假設A并B實作IC:
void MyMethod(List<IC> objects)
{
foreach(IC object in objects)
{
var cProperty = object.CProperty; // use common property
if(object is A a)
var aProperty = a.AProperty; // if A, use unique property
}
}
void Foo()
{
List<IC> cObjects = new();
cObjects.Add(new A());
cObjects.Add(new B());
MyMethod(cObjects);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/428609.html
