使用静态类作为另一个类的输入参数

时间:2017-12-06 23:04:10

标签: c# class parameter-passing

我不知道这是否可行,但感觉应该是从使用C#到目前为止。

我想要一堆静态类,其中包含'设置值'用于库的用户作为参数发送到另一个类。

所以这就是我的目标,但我无法弄明白。以下只是我所想的一个例子,所以不要尝试解决问题'为什么' : - )

首先 - 将被调用的类

public class myClass
    {
        public bool isError { private set; get; }

        public DataTable output { private set; get; }

        public String filename { set; private get; }

        public settingModule settings { set; private get; }

        public static void execute()
        {


            //Call Private 'getTheData'
            //set isError accordingly
            //Load output


        }

        private static DataTable getTheData()
        {
            //Open and read file for 'fileName'

            //Use settings.startingRow
            //Use settings.fileType
            //User settings.skipEmpty

            //Do some stuff

            return Datatable from workings

        }



    }

第二 - 我希望用户传递的课程

public static class settingMobule
    {
        public static class fileTypeA
        {
            public static int startingRow = 1;
            public static String fileType = "txt";
            public static bool skipEmpty = true;
        }

        public static class fileTypeB
        {
            public static int startingRow = 10;
            public static String fileType = "csv";
            public static bool skipEmpty = false;
        }

        public static class fileTypeC
        {
            public static int startingRow = 3;
            public static String fileType = "hex";
            public static bool skipEmpty = true;
        }

    }

最后我希望能够称之为

myClass test = new myClass();

test.filename = "c:\\temp\\test.txt;

test.settings = settingModule.fileTypeA;

test.execute();

if(test.isError == false

{
DataTable myTable = test.output;
test.dispose()
}

提前致谢...是的,"你的坚果有更好的方法"是一个非常有效的答案: - )

我也很想知道如何在我的代码中添加.dispose(),它不是我必须要做的事情,但是当我在这里时...... :-D

3 个答案:

答案 0 :(得分:4)

不,基本上;但你可以这样做:

public sealed class SettingMobule
{
    public int StartingRow {get; private set;}
    public string FileType {get; private set;}
    public bool SkipEmpty {get; private set;}

    private SettingMobule(int startingRow, string fileType, bool skipEmpty)
    {
        StartingRow = startingRow;
        FileType = fileType;
        SkipEmpty = skipEmpty;
    }
    public static SettingMobule FileTypeA {get;}
          = new SettingMobule(1, "txt", true);

    public static SettingMobule FileTypeB {get;}
          = new SettingMobule(10, "csv", false);

    public static SettingMobule FileTypeC {get;}
          = new SettingMobule(3, "hex", true);

}

并将SettingMobule.FileTypeA作为实例传递等

答案 1 :(得分:4)

没有。这是不可能的。由于两个原因,这是不可能的:

  1. 无法传递静态类。

  2. 接收方无法知道这些类应该包含相同的设置集,并且无法访问它们。

  3. 选择另一种方法,其中只有一个非静态文件类型类用于创建多个设置对象:(C#6.0)

    public class FileType
    {
        public FileType(int startingRow, string extension, bool skipEmpty)
        {
            this.StartingRow = startingRow;
            this.Extension = extension;  // 'FileType': Member names cannot be the same as their
                                         // enclosing type.
            this.SkipEmpty = skipEmpty;
        }
    
        public int StartingRow { get; }
        public string Extension { get; }
        public bool SkipEmpty { get; }
    }
    

    静态设置类现在可以呈现几个可以传递的相同类型的设置对象。

    public static class SettingModule
    {
        public static FileType TxtFileType { get; } = new FileType(1, "txt", true);
        public static FileType CsvFileType { get; } = new FileType(10, "csv", false);
        public static FileType HexFileType { get; } = new FileType(3, "hex", true);
    }
    

    现在,测试类可以写成:

    public class MyTestClass
    {
        private FileType fileType;
        private string filename;
    
        public MyTestClass(FileType fileType, string filename)
        {
            this.fileType = fileType;
            this.filename = filename;
        }
    
        public void Execute()
        {
            Console.WriteLine(
                $"Extension = {fileType.Extension}, starting row = {fileType.StartingRow}");
        }
    }
    

    你可以像这样进行测试

    var test = new MyTestClass(SettingModule.TxtFileType, @"c:\temp\test.txt");
    test.Execute();
    

    非静态类是一种模板,可以从中创建大量对象。与静态类不同,此类是可用于声明变量,方法参数,属性等的类型。

答案 2 :(得分:0)

不幸的是,在C#中,静态类的限制非常有限。

然而,使用Reflection和Type s,你可以做类似的事情,但我认为你不应该这样做。

void Main() {
    var test = new MyClass(typeof(settingModule.fileTypeB));
    Console.WriteLine(test.StartingRow);
}

public class MyClass {
    Type SettingsClass { get; set; }

    public MyClass(Type sc) {
        SettingsClass = sc;
    }

    public int StartingRow {
        get {
            return (int)SettingsClass.GetField("startingRow", BindingFlags.Static | BindingFlags.Public).GetValue(null);
        }
    }
}

public static class settingModule {
    public static class fileTypeA {
        public static int startingRow = 1;
        public static String fileType = "txt";
        public static bool skipEmpty = true;
    }

    public static class fileTypeB {
        public static int startingRow = 10;
        public static String fileType = "csv";
        public static bool skipEmpty = false;
    }

    public static class fileTypeC {
        public static int startingRow = 3;
        public static String fileType = "hex";
        public static bool skipEmpty = true;
    }

}

我认为你应该做的是创建一个子类的实例并传递它:

void Main() {
    var test = new MyClass();
    test.Settings = settingModule.fileTypeA;
    Console.WriteLine(test.Settings.startingRow);
}

public class MyClass {
    public settingModule.settingsSet Settings { get; set; }

}

public static class settingModule {
    public class settingsSet {
        public readonly int startingRow;
        public readonly string fileType;
        public readonly bool skipEmpty;
        public settingsSet(int sr, string ft, bool se) {
            startingRow = sr;
            fileType = ft;
            skipEmpty = se;
        }
    }

    public static settingsSet fileTypeA = new settingsSet(1, "txt", true);
    public static settingsSet fileTypeB = new settingsSet(10, "csv", false);
    public static settingsSet fileTypeC = new settingsSet(3, "hex", true);
}

你甚至可以把它写得更像你的静态类:

public static class settingModule {
    public struct settingsSet {
        public int startingRow;
        public string fileType;
        public bool skipEmpty;
    }

    public static readonly settingsSet fileTypeA = new settingsSet {
        startingRow = 1,
        fileType = "txt",
        skipEmpty = true
    };

    public static readonly settingsSet fileTypeB = new settingsSet {
        startingRow = 10,
        fileType = "csv",
        skipEmpty = false
    };

    public static readonly settingsSet fileTypeC = new settingsSet {
        startingRow = 3,
        fileType = "hex",
        skipEmpty = true
    };
}