Явные методы интерфейса имеют private
уровень доступа.
Давайте посмотрим (с помощью Отражение ):
using System.Reflection;
...
var result = typeof(Test)
.GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)
.Select(info => $"{(info.IsPrivate ? "private" : "not private")} {info.Name}");
string report = string.Join(Environment.NewLine, result);
Consolw.Write(report);
Результат:
private WFA_Junk_4.Form1.ITest.Test // <- Method of interest
not private Equals
not private GetHashCode
not private Finalize
not private GetType
not private MemberwiseClone
not private ToString
Так что мы не можем выполнить их явно:
Test test = new Test();
// ITest.Test() call which is OK
(test as ITest).Test();
// Doesn't compile:
// 1. Private method
// 2. Wrong name; should be typeof(ITest).FullName.Test() which is not allowed
test.Test();
Поскольку мы не можем поставить имя метода таким, какое оно есть, единственный способ прямого вызова ITest.Test
- это отражение:
class Test : ITest {
...
public void SomeMethod()
{
// we can't put method's name as it is `SomeNamespace.ITest.Test`
// Let's find it and execute
var method = this
.GetType()
.GetMethod($"{(typeof(ITest)).FullName}.Test",
BindingFlags.Instance | BindingFlags.NonPublic);
method.Invoke(this, new object[0]);
}