如果類型是接口,爲什麼Type.GetProperty(string)
不從基接口獲取屬性?例如,下面的代碼打印:爲什麼C#Type.GetProperty()對於接口的行爲與基類不同?
System.String X
null
System.String X
System.String X
這似乎是不一致的:
void Main()
{
Console.WriteLine(typeof(I1).GetProperty("X"));
Console.WriteLine(typeof(I2).GetProperty("X"));
Console.WriteLine(typeof(C1).GetProperty("X"));
Console.WriteLine(typeof(C2).GetProperty("X"));;
}
public interface I1 { string X { get; } }
public interface I2 : I1 { }
public class C1 { public string X { get { return "x"; } } }
public class C2 : C1 { }
編輯:支持科爾的回答運行的另一個方面是:
public class C : I2 {
// not allowed: the error is
// 'I2.X' in explicit interface declaration is not a member of interface
string I2.X { get; set; }
// allowed
string I1.X { get; set; }
}
它與它是一個類或接口沒有任何關係。 X是私人的,另一個是公共的。 – 2013-03-14 20:38:55
接口可以顯式實現('隱藏'實現類上的方法),而類上的公共屬性始終可見。如果您在C1上顯式實現I1,則會看到相同的行爲,而如果隱式實現它,GetProperty將會找到它。 – 2013-03-14 20:40:59
@CoryNelson所有接口屬性都是公共的。還是你說I2明確實現了I1,因此I1方法是私有的?如果這是真的,那麼爲什麼你可以通過一個I2的實例訪問X而不用投射? – ChaseMedallion 2013-03-14 21:04:56