এটি একটি উদাহরণের জন্য সামান্য দীর্ঘ-ইশ, তবে এটি তুলনামূলকভাবে দৃ approach় পদ্ধতির এবং অজানা মান থেকে অজানা প্রকারে কাস্টিংয়ের কাজটিকে পৃথক করে
আমার কাছে ট্রাইকাস্ট পদ্ধতি রয়েছে যা একই রকম কিছু করে, এবং বিবেচনামূলক ধরণের অ্যাকাউন্টগুলিতে নেয়।
public static bool TryCast<T>(this object value, out T result)
{
var type = typeof (T);
// If the type is nullable and the result should be null, set a null value.
if (type.IsNullable() && (value == null || value == DBNull.Value))
{
result = default(T);
return true;
}
// Convert.ChangeType fails on Nullable<T> types. We want to try to cast to the underlying type anyway.
var underlyingType = Nullable.GetUnderlyingType(type) ?? type;
try
{
// Just one edge case you might want to handle.
if (underlyingType == typeof(Guid))
{
if (value is string)
{
value = new Guid(value as string);
}
if (value is byte[])
{
value = new Guid(value as byte[]);
}
result = (T)Convert.ChangeType(value, underlyingType);
return true;
}
result = (T)Convert.ChangeType(value, underlyingType);
return true;
}
catch (Exception ex)
{
result = default(T);
return false;
}
}
অবশ্যই ট্রাই কাস্ট একটি টাইপ প্যারামিটার সহ একটি পদ্ধতি, তাই এটিকে গতিশীল বলার জন্য আপনাকে নিজেই মেথডইনফোটি তৈরি করতে হবে:
var constructedMethod = typeof (ObjectExtensions)
.GetMethod("TryCast")
.MakeGenericMethod(property.PropertyType);
তারপরে প্রকৃত সম্পত্তি মান সেট করতে:
public static void SetCastedValue<T>(this PropertyInfo property, T instance, object value)
{
if (property.DeclaringType != typeof(T))
{
throw new ArgumentException("property's declaring type must be equal to typeof(T).");
}
var constructedMethod = typeof (ObjectExtensions)
.GetMethod("TryCast")
.MakeGenericMethod(property.PropertyType);
object valueToSet = null;
var parameters = new[] {value, null};
var tryCastSucceeded = Convert.ToBoolean(constructedMethod.Invoke(null, parameters));
if (tryCastSucceeded)
{
valueToSet = parameters[1];
}
if (!property.CanAssignValue(valueToSet))
{
return;
}
property.SetValue(instance, valueToSet, null);
}
এবং সম্পত্তি.CanAssignValue মোকাবেলা করার জন্য এক্সটেনশন পদ্ধতিগুলি ...
public static bool CanAssignValue(this PropertyInfo p, object value)
{
return value == null ? p.IsNullable() : p.PropertyType.IsInstanceOfType(value);
}
public static bool IsNullable(this PropertyInfo p)
{
return p.PropertyType.IsNullable();
}
public static bool IsNullable(this Type t)
{
return !t.IsValueType || Nullable.GetUnderlyingType(t) != null;
}