Мне нравится создавать интерфейс, указывающий, что класс должен иметь хотя бы одно свойство ICollection
public interface ILinked<T> where T : class, IModel
{
ICollection<T> LinkedT { get; set; }
}
но я хочу, чтобы класс реализации мог свободно выбирать фактическое имя свойства. Это возможно?
Это невозможно; в С# интерфейс не может определить тип и модификаторы доступа самостоятельно, не указывая имя.
Поскольку вы формулируете требование наличия "хотя бы одного свойства, если ICollection", возможно, проблема может быть решена путем определения свойства типа ICollection<ICollection<object>>
.
В некотором смысле, да. Вам просто нужно указать, какое свойство вашего класса является тем, которое реализует свойство интерфейса. В конце концов, с этой сигнатурой может быть несколько свойств, и компилятор должен знать, что делать, когда к someVariableOfTypeILinkedT.LinkedT
обращается какое-то someVariableOfTypeILinkedT.LinkedT
. Это можно сделать, реализовав интерфейс явно.
Для этого С# требует немного кода котельной...
class MyClass : ILinked<MyParameter> {
public ICollection<MyParameter> SomeArbitraryProperty { get; set; }
ICollection<MyParameter> ILinked<MyParameter>.LinkedT
{
get { return SomeArbitraryProperty; }
set { SomeArbitraryProperty = value; }
}
}
... в то время как VB.NET в этом случае является более кратким и позволяет напрямую сопоставить реализацию с методом интерфейса:
Class MyClass
Implements ILinked(Of MyParameter)
Public Property SomeArbitraryProperty As ICollection(Of MyParameter) _
Implements ILinked(Of MyParameter).LinkedT
End Class