Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
相同的主体函数适用于不同类型的输入c#_C# - Fatal编程技术网

相同的主体函数适用于不同类型的输入c#

相同的主体函数适用于不同类型的输入c#,c#,C#,我有这样一个函数: void myFunc(String path) { SpecialObject special1 = new SpecialObject(path); } Function1() { PDFProcessor processor = new PDFProcessor(); processor.addDataSrc(new PDFDataSource(STRING OR STREAM)); processor.Work(); } 现在,我的特殊

我有这样一个函数:

 void myFunc(String path)
{
SpecialObject special1 = new SpecialObject(path);

}
Function1()
{
    PDFProcessor processor = new PDFProcessor();
    processor.addDataSrc(new PDFDataSource(STRING OR STREAM));
    processor.Work();
}
现在,我的特殊对象有几个构造函数的重载,例如,它也可以将流作为输入。 如何避免需要其他功能,如:

void myFunc(Stream stream)
{
SpecialObject special1 = new SpecialObject(stream);

}
编辑: 我在做一个文件处理例程,只有function1实际使用了Stream对象,我想在Main函数的持续时间内锁定文件,所以我认为如果打开一个文件,保持它打开,就可以完成任务,因为我想干扰这个文件:

mainFunction(string inputFile)
{
    Stream stream = new FileStream(inputFile,FileMode.Open);
    Function1();
    Function2();
    Function3();
    Function4();
    stream.Close();
}
现在Function1()是这样的:

 void myFunc(String path)
{
SpecialObject special1 = new SpecialObject(path);

}
Function1()
{
    PDFProcessor processor = new PDFProcessor();
    processor.addDataSrc(new PDFDataSource(STRING OR STREAM));
    processor.Work();
}

我可以使用流类型。。但最初我使用的是字符串类型。。现在我想把两者都保留下来。

myFunc
放在
SpecialObject
里面。如果它只关心
SpecialObject
,那么将其作为它的成员函数


如果不可能,让
myFunc
SpecialObject
作为其参数,这样您就不必担心构造它。

myFunc
放入
SpecialObject
中。如果它只关心
SpecialObject
,那么将其作为它的成员函数

如果不可能,让
myFunc
SpecialObject
作为其参数,这样您就不必担心构造它了。

您可以这样做

void myFunc(Object obj)
{
    SpecialObject special1 = null;
    if (obj is string)
        special1 = new SpecialObject(obj as string);
    else if (obj is Stream)
        special1 = new SpecialObject(obj as Stream);
}
您需要处理传入的错误对象类型。

您可以这样做

void myFunc(Object obj)
{
    SpecialObject special1 = null;
    if (obj is string)
        special1 = new SpecialObject(obj as string);
    else if (obj is Stream)
        special1 = new SpecialObject(obj as Stream);
}

您需要处理传入的错误对象类型。

如果您控制输入类型的代码,则可以使用接口或基类:

public interface ISpecialObjectCreateable { ... }

public MyClassA : ISpecialObjectCreateable { ... }

public MyClassB : ISpecialObjectCreateable { ... }

public class SpecialObject
{
    public SpecialObject(ISpecialObjectCreatable createable)
    {
       ...
    }
}
现在您可以将
MyFunc
定义为:

void myFunc(ISpecialObjectCreateable createable)
{
    SpecialObject special1 = new SpecialObject(createable);

}

但是,如果您不控制输入类型的代码(例如,框架中内置的
string
Stream
类型),则无法避免重载和维护类型安全

如果控制输入类型的代码,则可以使用接口或基类:

public interface ISpecialObjectCreateable { ... }

public MyClassA : ISpecialObjectCreateable { ... }

public MyClassB : ISpecialObjectCreateable { ... }

public class SpecialObject
{
    public SpecialObject(ISpecialObjectCreatable createable)
    {
       ...
    }
}
现在您可以将
MyFunc
定义为:

void myFunc(ISpecialObjectCreateable createable)
{
    SpecialObject special1 = new SpecialObject(createable);

}

但是,如果您不控制输入类型的代码(例如,框架中内置的
string
Stream
类型),则无法避免重载和维护类型安全

myFunc
取而代之的是
SpecialObject
。如果我对情况了解得更多,我可能会给出不同的答案

myFunc(new SpecialObject(path));
myFunc(new SpecialObject(stream));

void myFunc(SpecialObject special)
{
  ...
}

myFunc
取而代之的是
SpecialObject
。如果我对情况了解得更多,我可能会给出不同的答案

myFunc(new SpecialObject(path));
myFunc(new SpecialObject(stream));

void myFunc(SpecialObject special)
{
  ...
}
在客户端代码中,为了清晰起见,可以使用命名参数

myFunc(aStream: thisStream);
myfunc(aString: thisString);
当然,我们可以抛出
myFunc
曲线;我必须检查一下

myFunc(thisStream, thisString);
在客户端代码中,为了清晰起见,可以使用命名参数

myFunc(aStream: thisStream);
myfunc(aString: thisString);
当然,我们可以抛出
myFunc
曲线;我必须检查一下

myFunc(thisStream, thisString);
这只是一个糟糕的练习。