هذا الكائن هو نوع لا يتجزأ. هل يمكنني الحصول على قيمتها في أقل من خمسة أسطر من التعليمات البرمجية؟
-
08-07-2019 - |
سؤال
ولدي القارئ البيانات. أريد أن مقارنة قيمة فيه بقيمة 42. وأنا أعلم أنه هو نوع لا يتجزأ (على سبيل المثال، ما يدعو الخلية INT
، TINYINT
، SMALLINT
، MEDIUMINT
، BIGINT
، JUMBODELUXEINT
، وما إلى ذلك). أنا لا أريد أن باستخدام الأسلاك نوع الفعلي في لC # رمز. أفضل ما قد حان حتى مع غير
object x = reader.GetValue(i);
uint k = x is byte ? (byte) x
: x is short ? (uint) (short) x
: x is ushort ? (ushort) x
: x is int ? (int) (int) x
: (uint) x;
if (k == 42) { ... }
وهذا يبدو منذ فترة طويلة ينضب بشكل لا يصدق. حاولت استخدام Equals
لكن أنواع أساسية مختلفة مع نفس القيمة لا تظهر لاختبار على قدم المساواة.
هل هناك طريقة أفضل؟
المحلول
Convert.ToUInt32(object)
... نعم، أنه يعمل بشكل جيد:
using System;
class Test
{
static void Main()
{
Check((byte)10);
Check((short)10);
Check((ushort)10);
Check((int)10);
Check((uint)10);
}
static void Check(object o)
{
Console.WriteLine("Type {0} converted to UInt32: {1}",
o.GetType().Name, Convert.ToUInt32(o));
}
}
وبعبارة أخرى، يمكن أن الشفرة هي:
object x = reader.GetValue(i);
uint k = Convert.ToUInt32(x);
if (k == 42) { ... }
وبدلا من ذلك، بالنظر إلى أن جميع uint
s هي للتمثيل كما يتوق، إذا كنت تستخدم قارئ البيانات قد تتمكن من محاولة reader.GetInt64(i)
؟ أنا لا أعرف مرتجلا ما إذا كان سيتم إجراء التحويل بالنسبة لك، لكنه ربما يستحق المحاولة.
نصائح أخرى
if(Convert.ToUInt32(reader.GetValue(i)) == 42) { ... }
هل يمكن أيضا القيام إجابات السكيت ودانيال في الاتجاه المعاكس مثل هذا:
if (k == Convert.ChangeType(42, k.GetType()) { ... }
وأنا لم نجرب ذلك على الرغم من.
ولست متأكدا إذا كنت فهمت بشكل صحيح، ولكن أعتقد أن هذا يجب أن تعمل:
int x = int.Parse(reader.GetValue(i).ToString());
if(x == 42) { // do your logic }
ويمكنك أن تجرب هذا:
unit k = Convert.ToUInt32(x);
وأنت سيكون أفضل عمل إعادة تسمية المتغيرات الخاصة بك، وإن كان. 1 إلكتروني المتغيرات <م> سوو الأسبوع الماضي م>.
وهذا يجب أن تعمل:
object x = reader.GetValue(i);
uint k;
try
{
k = Convert.ToUInt32(x);
}
catch(InvalidCastException e) { ... }
if (k == 42) { ... }