Как я могу вызвать метод в пользовательском Списке <T>из свойства? - PullRequest
0 голосов
/ 19 марта 2020

Итак, я сейчас работаю над переписыванием VB. NET приложения, над которым я работал C# (для обновления), и я наткнулся на небольшую загадку, которая мне не кажется выяснить. Я пытаюсь циклически просмотреть свойства объектов, получить все свойства типа CustomList и запустить метод Save для каждого.

VB. NET Код для CustomList

Friend Class CustomList(Of T)
    Inherits List(Of T)

    Private ReadOnly Property FileName As String
        Get
            Return GetType(T).ToString + ".json"
        End Get
    End Property
    Private ReadOnly Property Campaign As Campaign
    Private ReadOnly Property FilePath As String
        Get
            Return Source.SourcePath + FileName
        End Get
    End Property

    Public Sub New(source As Source)
        _Source= source
        If IO.File.Exists(FilePath) Then Me.AddRange(JSON_Functions.LoadJSONObject(Of CustomList(Of T))(FilePath))
    End Sub

    Public Sub New(objList As List(Of T))
        Me.AddRange(objList)
    End Sub

    Public Sub Save()
        JSON_Functions.SaveJsonObject(FilePath, Me)
    End Sub
End Class

C# Код для пользовательского списка

public class CustomList<T> : List<T>
    {
        private static string FileName { get { return typeof(T).Name + ".json"; } }
        private Source Source { get; set; }
        private static string FilePath { get { return Source.Path + FileName; } }

        public CustomList(Source source)
        {
            this.Source = source;
            if (File.Exists(FilePath))
                this.AddRange(GlobalElements.JSON_Functions.LoadJsonObject<CustomList<T>>(FilePath));
        }

        public CustomList(List<T> objList) { this.AddRange(objList); }
        public void Save() { GlobalElements.JSON_Functions.SaveJsonObject(FilePath, this); }
     }

Я пытаюсь вызвать команду Сохранить для каждого свойства CustomList, но ничего не зашло в тупик. В VB. NET я смог сделать это относительно простым способом, но в C# я не нашел ничего эквивалентного.

Моя конечная цель - сохранить Object1List, Object2List, Object3List, et c. через al oop вместо того, чтобы вызывать каждое свойство Сохранить метод индивидуально.

VB. NET Код для методов сохранения (это обрабатывает любой общий список c, но я все еще могу вызвать метод без отдельного определения объекта VB.NETS)

    Public ReadOnly Property Object1List As CustomList(Of Object1)
    Public ReadOnly Property Object2List As CustomList(Of Object2)
    Public ReadOnly Property Object3List As CustomList(Of Object3)

    //other code stuffs

    Public Sub SaveCampaign()
        For Each p As PropertyInfo In Me.GetType.GetProperties
            If GetType(IList).IsAssignableFrom(p.PropertyType) AndAlso p.PropertyType.IsGenericType Then p.GetValue(Me).Save()
        Next
    End Sub

C# Код для методов сохранения

        public CustomList<Object1> Object1List { get; private set; }
        public CustomList<Object2> Object2List { get; private set; }
        public CustomList<Object3> Object3List { get; private set; }

       //Other Code Stuff

        public void SaveSource()
        {
            foreach (PropertyInfo p in this.GetType().GetProperties())
            {
                if (typeof(IList).IsAssignableFrom(p.PropertyType) && p.PropertyType.IsGenericTypeDefinition)
                   p.GetValue(this).Save();
            }
        }

Возвращает ошибку при p.GetValue(this).Save();:

    'object' does not contain a definition for 'Save' and no accessible extension method 'Save' accepting a first argument of type 'object' could be found (are you missing a using directive or an assembly reference?)

Самая большая причина, по которой я хочу выполнить sh, заключается в том, что у меня может быть 10+ CustomList и я не хочу перечислять их каждый раз.

Если кто-то может дать какой-то совет, я был бы очень признателен !!!

1 Ответ

1 голос
/ 19 марта 2020

Один из вариантов:

public interface IMyCustomList
{
    void Save();
}

public class CustomList<T> : List<T>, IMyCustomList
{ .... }

Затем приведите значение вашего свойства к интерфейсу

var propValue = p.GetValue(this);
if (propValue != null && propValue is IMyCustomList myList)
    myList.Save();

Но, тем не менее, я не думаю, что это хорошо для l oop через такие свойства.

...