オブジェクトを実行時に割り当てられる型に変換したい。
たとえば、文字列値(TextBox or Dropdownlist
から)をObject.Property
に割り当てる関数があるとします。
値を適切なタイプに変換するにはどうすればよいですか?たとえば、整数、文字列、列挙型などです。
Public void Foo(object obj,string propertyName,object value)
{
//Getting type of the property og object.
Type t= obj.GetType().GetProperty(propName).PropertyType;
//Now Setting the property to the value .
//But it raise an error,because sometimes type is int and value is "2"
//or type is enum (e.a: Gender.Male) and value is "Male"
//Suppose that always the cast is valid("2" can be converted to int 2)
obj.GetType().GetProperty(propName).SetValue(obj, value, null);
}
Convert.ChangeType(...)関数を使用する必要があります(入力はオブジェクトと同じように簡単にできます...文字列バージョンをプリベークしただけです):
/// <summary>
/// Sets a value in an object, used to hide all the logic that goes into
/// handling this sort of thing, so that is works elegantly in a single line.
/// </summary>
/// <param name="target"></param>
/// <param name="propertyName"></param>
/// <param name="propertyValue"></param>
public static void SetPropertyValueFromString(this object target,
string propertyName, string propertyValue)
{
PropertyInfo oProp = target.GetType().GetProperty(propertyName);
Type tProp = oProp.PropertyType;
//Nullable properties have to be treated differently, since we
// use their underlying property to set the value in the object
if (tProp.IsGenericType
&& tProp.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))
{
//if it's null, just set the value from the reserved Word null, and return
if (propertyValue == null)
{
oProp.SetValue(target, null, null);
return;
}
//Get the underlying type property instead of the nullable generic
tProp = new NullableConverter(oProp.PropertyType).UnderlyingType;
}
//use the converter to get the correct value
oProp.SetValue(target, Convert.ChangeType(propertyValue, tProp), null);
}
ユニバーサルタイプコンバーターはあなたが求めているものです!?簡単な偉業ではない。
このアプローチを試してください:
NuGet Install-Package UniversalTypeConverter
また、ここでの質問からGenerics
を使用していますか?変換のターゲットタイプを少なくとも知っていれば、ソリューションが容易になります。
これはあなたがそれを行うことができる別の方法ですが、私にはわかりません
ジェネリック型のサポートなし:
public void Foo(object obj,string propertyName,object value)
{
//Getting type of the property og object.
Type type = obj.GetType().GetProperty(propertyName).PropertyType;
obj.GetType().GetProperty(propertyName).SetValue(obj, Activator.CreateInstance(type, value), null);
}
ジェネリック型をサポート:
public void Foo(object obj,string propertyName,object value)
{
//Getting type of the property og object.
Type type = obj.GetType().GetProperty(propertyName).PropertyType;
if (type.IsGenericType)
type = type.GetGenericArguments()[0];
obj.GetType().GetProperty(propertyName).SetValue(obj, Activator.CreateInstance(type, value), null);
}
C#ではConvert関数を使用しました。私が変換を行う方法は、リフレクションを使用することです。
Type type = this.myObject.GetType();
if (type.Name == "MyObjectClass") {
var Voucherrequest = (MyObjectClass)Convert.ChangeType(myObject, typeof(MyObjectClass));
これは、変換先の型がわかっていることを前提としています。スイッチを作成して、反映したいタイプを複数持つこともできます。
それが機能するかどうかはわかりませんが、試してみてください:
public static T To<T>(this IConvertible obj)
{
return (T)Convert.ChangeType(obj, typeof(T));
}
Public void Foo(object obj,string propertyName,object value)
{
Type t= obj.GetType().GetProperty(propName).PropertyType;
obj.GetType().GetProperty(propName).SetValue(obj, value.To<t>(), null);
}