如何将自己类的对象放入 Predicate 委托中

问题描述 投票:0回答:1

我正在制作一个数据处理类,其getData方法的返回是根据使用委托谓词传递给它的函数进行的。getData方法也计划被其他类使用,所以我使用了通用的 但我不能将自己类的对象放入委托参数中

我想将概括传递给代表,但我不知道该怎么做。我也尝试过将我的类直接放入函数中,但这也没有帮助。

public class Program
{
    public static void Main()
    {
        var result1 = new MyDataProcessing().GetData<MyFile>("C:\\",MyFunc);
        var result2 = new MyDataProcessing().GetData<MyFile>("C:\\", MyFunc2);
    }  
    static bool MyFunc(MyFile file)=>file.FileInfo.Name.Contains("A");
    static bool MyFunc2(MyFile file) => file.FileInfo.Length>1000;
}
interface MyData
{
}
public class MyFile:MyData
{
    public MyFile(string name)
    {
        FileInfo = new FileInfo(name);
    }
   public FileInfo FileInfo { get; }
}

public  class MyDataProcessing 
{
    public List<T> GetData<T>(string path,Predicate<T>? filter = null)
    {
        List<T> list = new();
        IEnumerable<string> files;
        if (filter != null && typeof(T).Name is MyFile)
        {
            files = Directory.EnumerateFiles(path).Where(x => filter(new MyFile(x)));
            foreach (var file in files)
                list.Add(new MyFile(file));
        }
        return list;
    }
}

谢谢!我考虑了你的意见,结果就是这样,这段代码有什么意见吗?

    public class Program
{
    public bool MyFunc(IMyData data)
    {
        if (data is MyFile myfile)
        {
            return myfile.FileInfo.Name.Contains("A");
        }

        return false;
    }
    public bool MyFunc2(IMyData data)
    {
        if (data is MyFile myfile)
        {
            return myfile.FileInfo.Length > 1000;
        }

        return false;
    }

    public static void Main()
    {
        var p = new Program();
        var result1 = new MyDataProcessing().GetData("C:\\", p.MyFunc);
        var result2 = new MyDataProcessing().GetData("C:\\", p.MyFunc2);
    }


    public interface IMyData { }

    public class MyFile : IMyData
    {
        public MyFile(string name)
        {
            FileInfo = new FileInfo(name);
        }
        public FileInfo FileInfo { get; }
    }

    public class MyDataProcessing
    {
        public List<IMyData> GetData(string path, Predicate<IMyData>? filter = null)
        {
            List<IMyData> list = new();
            IEnumerable<string> files;

            if (filter != null)
            {
                files = Directory.EnumerateFiles(path).Where(x => filter(new MyFile(x)));
                foreach (var file in files)
                    list.Add(new MyFile(file));
            }
            return list;
        }
    }
c# .net generics delegates predicate
1个回答
0
投票

我找到了使用新的接口中的静态抽象成员功能的解决方案:

public interface MyData<T>
{
    T Data { get; }
    static abstract IEnumerable<T> EnumerateData(string path);
    static abstract MyData<T> Create(T info);
}

该接口包含一个用于枚举数据的静态方法和一个用于创建带有一个参数的 MyData 对象的方法。这很有用,因为我们无法在接口中声明构造函数。

一个示例实现是:

public class MyFile : MyData<FileInfo>
{
    public MyFile(FileInfo fileInfo)
    {
        Data = fileInfo;
    }

    public FileInfo Data { get; }

    public static IEnumerable<FileInfo> EnumerateData(string path)
        => new DirectoryInfo(path).EnumerateFiles();

    public static MyData<FileInfo> Create(FileInfo info) => new MyFile(info);
}
© www.soinside.com 2019 - 2024. All rights reserved.