mirror of
https://github.com/S7NetPlus/s7netplus.git
synced 2026-02-17 22:38:27 +08:00
fix: Fix warnings in Struct
This commit is contained in:
@@ -98,8 +98,8 @@ namespace S7.Net.Types
|
||||
int bytePos = 0;
|
||||
int bitPos = 0;
|
||||
double numBytes = 0.0;
|
||||
object structValue = Activator.CreateInstance(structType);
|
||||
|
||||
object structValue = Activator.CreateInstance(structType) ??
|
||||
throw new ArgumentException($"Failed to create an instance of the type {structType}.", nameof(structType));
|
||||
|
||||
var infos = structValue.GetType()
|
||||
#if NETSTANDARD1_3
|
||||
@@ -254,6 +254,14 @@ namespace S7.Net.Types
|
||||
|
||||
foreach (var info in infos)
|
||||
{
|
||||
static TValue GetValueOrThrow<TValue>(FieldInfo fi, object structValue) where TValue : struct
|
||||
{
|
||||
var value = fi.GetValue(structValue) as TValue? ??
|
||||
throw new ArgumentException($"Failed to convert value of field {fi.Name} of {structValue} to type {typeof(TValue)}");
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
bytes2 = null;
|
||||
switch (info.FieldType.Name)
|
||||
{
|
||||
@@ -261,7 +269,7 @@ namespace S7.Net.Types
|
||||
// get the value
|
||||
bytePos = (int)Math.Floor(numBytes);
|
||||
bitPos = (int)((numBytes - (double)bytePos) / 0.125);
|
||||
if ((bool)info.GetValue(structValue))
|
||||
if (GetValueOrThrow<bool>(info, structValue))
|
||||
bytes[bytePos] |= (byte)Math.Pow(2, bitPos); // is true
|
||||
else
|
||||
bytes[bytePos] &= (byte)(~(byte)Math.Pow(2, bitPos)); // is false
|
||||
@@ -270,26 +278,26 @@ namespace S7.Net.Types
|
||||
case "Byte":
|
||||
numBytes = (int)Math.Ceiling(numBytes);
|
||||
bytePos = (int)numBytes;
|
||||
bytes[bytePos] = (byte)info.GetValue(structValue);
|
||||
bytes[bytePos] = GetValueOrThrow<byte>(info, structValue);
|
||||
numBytes++;
|
||||
break;
|
||||
case "Int16":
|
||||
bytes2 = Int.ToByteArray((Int16)info.GetValue(structValue));
|
||||
bytes2 = Int.ToByteArray(GetValueOrThrow<short>(info, structValue));
|
||||
break;
|
||||
case "UInt16":
|
||||
bytes2 = Word.ToByteArray((UInt16)info.GetValue(structValue));
|
||||
bytes2 = Word.ToByteArray(GetValueOrThrow<ushort>(info, structValue));
|
||||
break;
|
||||
case "Int32":
|
||||
bytes2 = DInt.ToByteArray((Int32)info.GetValue(structValue));
|
||||
bytes2 = DInt.ToByteArray(GetValueOrThrow<int>(info, structValue));
|
||||
break;
|
||||
case "UInt32":
|
||||
bytes2 = DWord.ToByteArray((UInt32)info.GetValue(structValue));
|
||||
bytes2 = DWord.ToByteArray(GetValueOrThrow<uint>(info, structValue));
|
||||
break;
|
||||
case "Single":
|
||||
bytes2 = Real.ToByteArray((float)info.GetValue(structValue));
|
||||
bytes2 = Real.ToByteArray(GetValueOrThrow<float>(info, structValue));
|
||||
break;
|
||||
case "Double":
|
||||
bytes2 = LReal.ToByteArray((double)info.GetValue(structValue));
|
||||
bytes2 = LReal.ToByteArray(GetValueOrThrow<double>(info, structValue));
|
||||
break;
|
||||
case "String":
|
||||
S7StringAttribute? attribute = info.GetCustomAttributes<S7StringAttribute>().SingleOrDefault();
|
||||
@@ -298,8 +306,8 @@ namespace S7.Net.Types
|
||||
|
||||
bytes2 = attribute.Type switch
|
||||
{
|
||||
S7StringType.S7String => S7String.ToByteArray((string)info.GetValue(structValue), attribute.ReservedLength),
|
||||
S7StringType.S7WString => S7WString.ToByteArray((string)info.GetValue(structValue), attribute.ReservedLength),
|
||||
S7StringType.S7String => S7String.ToByteArray((string?)info.GetValue(structValue), attribute.ReservedLength),
|
||||
S7StringType.S7WString => S7WString.ToByteArray((string?)info.GetValue(structValue), attribute.ReservedLength),
|
||||
_ => throw new ArgumentException("Please use a valid string type for the S7StringAttribute")
|
||||
};
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user