我是C#的一个非常新的开发人员,我在创建DLL时遇到了一些问题。我需要创建一个DLL,外部系统将使用它从我的数据库中检索一些信息。基本上,他们会向我发送一个ID,我需要发回相关的信息。这是我的代码:
public bool GetLotInfo (string SupplierCode, out stLotInfo LotInfo, out string ErrorMessage)
{
//collect info
}
如何返回字符串ErrorMessage,因为该方法是Bool?
答案 0 :(得分:3)
查看您的方法签名,只需设置它:
public bool GetLotInfo (string SupplierCode, out stLotInfo LotInfo, out string ErrorMessage)
{
//collect info
//Oops, error:
ErrorMessage = "Something bad happened";
}
这是有效的,因为ErrorMessage被声明为out
参数。
答案 1 :(得分:2)
只需分配:
public bool GetLotInfo (string SupplierCode, out stLotInfo LotInfo, out string ErrorMessage)
{
//collect info
// LotInfo is out parameter and must be assigned...
LotInfo = new stLotInfo(...);
// ... as well as ErrorMessage
ErrorMessage = "My Message";
return true;
}
...
stLotInfo myLotInfo;
string myMessage;
if (GetLotInfo("MyCode", out myLotInfo, out myMessage)) {
//TODO: Put a relevant code with myLotInfo and myMessage
}
答案 2 :(得分:2)
out
参数是ref
参数的特例;它们通过引用传递,并且必须在方法返回之前设置。您可以详细了解他们here和here。
在您的情况下,可能的实施草图将是:
public bool GetLotInfo(string supplierCode, out StLotInfo lotInfo, out string errorMessage)
{
try
{
lotInfo = ... //whatever you need to do
errorMessage = null;
return true;
}
catch (MyExpectedException e) //Put here the specific exceptions you are expecting,
//Try to avoid catching the all encompassing System.Exception
{
errorMessage = e.Message;
lotInfo = null;
return false;
}
finally
{
//any clean up you need to do.
}
}
另外,作为补充建议,请尝试遵循c#命名准则:
StLotInfo
而不是stLotInfo
。supplierCode
而不是SupplierCode
,errorMessage
而不是ErrorMessage
等。St
中的StLontInfo
是什么?答案 3 :(得分:0)
在C#7.0中,你也可以使用元组:
var result = GetLotInfo("test");
WriteLine($"Success: {result.success}");
WriteLine($"Message: {result.message}");
WriteLine($"Lot: {result.lotInfo}");
方法调用:
Handler mHandler;
private void loopMocking(){
mHandler.post(mMockRunnable);
}
private Runnable mMockRunnable = new Runnable() {
@Override
public void run() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
newLocation.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos());
}
newLocation.setTime(System.currentTimeMillis());
lm.setTestProviderLocation(LocationManager.GPS_PROVIDER, newLocation);
mHandler.postDelayed(mMockRunnable, 1000); // At each 1 second
}
};
查看有关元组here
的更多信息