use*_*312 4 c# reflection .net-2.0
我需要这样做: -
MyClass.cs
using System;
using System.Collections.Generic;
using System.Text;
namespace set_property__Enum_To_Nullable_Enum
{
public enum MyEnum : short
{
One,
Two,
Three
}
public class MyClass
{
public string MyStringProperty { get; set; }
public MyEnum? MyEnumProperty { get; set; }
public void ShowAll(string message)
{
Console.WriteLine(message);
Console.WriteLine("String = " + MyStringProperty);
Console.WriteLine("Enum = " + MyEnumProperty.Value);
}
}
}
Run Code Online (Sandbox Code Playgroud)
Program.cs中
using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
namespace set_property__Enum_To_Nullable_Enum
{
class Program
{
static void Main(string[] args)
{
//Names
string myAssemblyName = "MyAssembly";
string myNamespaceName = "set_property__Enum_To_Nullable_Enum";
string myClassName = "MyClass";
string propertyNameOne = "MyStringProperty";
string propertyNameTwo = "MyEnumProperty";
//Data
string myString = "Hello World!";
short myInteger = 1;
//Preprocessing
Assembly myAssmbly = Assembly.Load(myAssemblyName);
Type myType = myAssmbly.GetType(myNamespaceName + "." + myClassName);
//Create class-instance
object objectInstance = Activator.CreateInstance(myType);
//Set property-values
PropertyInfo propertyInfoOne = myType.GetProperty(propertyNameOne);
propertyInfoOne.SetValue(objectInstance, myString, null);
PropertyInfo propertyInfoTwo = myType.GetProperty(propertyNameTwo);
propertyInfoTwo.SetValue(objectInstance, myInteger, null);//<---------------
//Call method
myType.InvokeMember("ShowAll",
BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.Public,
null,
objectInstance,
new object[] { "My name is Khan" });
string end = string.Empty;
}
}
}
Run Code Online (Sandbox Code Playgroud)
但Int32值不会自动转换为MyEnum.
在特定行,正在生成异常.
Object of type 'System.Int16' cannot be converted to type 'System.Nullable`1[set_property__Enum_To_Nullable_Enum.MyEnum]'.
Run Code Online (Sandbox Code Playgroud)
怎么做?
我需要进一步的帮助!
Enum.ToObject()无法处理null.
好的,你需要Enum.ToObject在这种情况下使用,因为你正在使用反射.但是你还需要打开可以使用它的nullable,这Nullable.GetUnderlyingType对你有帮助.
所以,你需要得到Type相应的MyEnum:
Type nullableEnumType = propertyInfoTwo.PropertyType;
Type enumType = Nullable.GetUnderlyingType(nullableEnumType);
Run Code Online (Sandbox Code Playgroud)
然后用于Enum.ToObject生成MyEnum带有您指定值的盒装实例:
object enumValue = Enum.ToObject(enumType, myInteger);
Run Code Online (Sandbox Code Playgroud)
所以,把它们放在一起:
object enumValue = Enum.ToObject(Nullable.GetUnderlyingType(propertyInfoTwo.PropertyType), myInteger);
propertyInfoTwo.SetValue(objectInstance, enumValue, null);
Run Code Online (Sandbox Code Playgroud)
编辑:
如果可以myInteger为空,那么你应该使用:
object enumValue =
myInteger.HasValue
? Enum.ToObject(Nullable.GetUnderlyingType(propertyInfoTwo.PropertyType), myInteger.Value);
: null;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3116 次 |
| 最近记录: |