gpt4 book ai didi

C# - 使用反射设置属性的属性

转载 作者:行者123 更新时间:2023-12-05 05:27:05 24 4
gpt4 key购买 nike

SO 社区,

所以我正在学习 C#,并且仍在努力思考反射问题。特别是尝试使用它来访问类上属性的属性。

我已经总结了我要在下面完成的基本任务:

public enum SIGNAL_STATE { NOT_RETRIEVED = 0, RETRIEVING = 1, RETRIEVED = 2, FAILED = 3 }

public class MyObjectClass
{
public string MyString;
private SIGNAL_STATE _state = SIGNAL_STATE.NOT_RETRIEVED;
public SIGNAL_STATE State { get { return _state; } set { _state = value;} }
}

public class NeedToReflect
{
private MyObjectClass _myObject1 = new MyObjectClass();
private MyObjectClass _myObject2 = new MyObjectClass();
private MyObjectClass _myObject3 = new MyObjectClass();

public MyObjectClass MyObject1
{
get{return _myObject1;}
set{_myObject1 = value;}
}

public MyObjectClass MyObject2
{
get{return _myObject2;}
set{_myObject2 = value;}
}

public MyObjectClass MyObject3
{
get{return _myObject3;}
set{_myObject3 = value;}
}

public static void Main(string [] args){
NeedToReflect needToReflect = new NeedToReflect();

string fieldName;
for(int idx = 1; idx<=3; ++idx)
{
fieldName = String.Format("MyObject{0}",idx);

//TODO: set state of 'MyObject' values to SIGNAL_STATE.RETRIEVING

}
}
}

编辑 1:

Yair Nevet 的建议下,我从适用的对象中获取 FieldInfo,例如,

FieldInfo fieldInfo = needToReflect.GetType().GetField(fieldName, BindingFlags.NonPublic | BindingFlags.GetField | BindingFlags.Instance);

但从那里我无法访问并在该成员字段上设置正确的“状态”字段/属性

解决方案(即,这是我在该 TODO 评论中插入的内容):

// Determine what binding flags will give us proper access to our member field
BindingFlags bindFlags = BindingFlags.NonPublic | BindingFlags.GetField | BindingFlags.Instance;
// Get the field for that field
FieldInfo fieldInfo = needToReflect.GetType().GetField(fieldName, bindFlags);
// Pass in the containing object that we're reflecting on to get an instance of the member field
MyObjectClass myField = (MyObjectClass) fieldInfo.GetValue(needToReflect);
// We can now directly access and edit the value in question
myField.State = SIGNAL_STATE.RETRIEVING;

就是这样。感谢 Shlomi Borovitz 为我指明了正确的方向。

谢谢!

最佳答案

GetField 返回的FieldInfo 对象具有名为FieldInfo 的属性,它返回该字段的类型。您可以查询该类型的(字段的类型)属性/字段(以及您想要的任何内容)- 并获取/设置它们。

请记住,GetType 方法(任何对象的)和 FieldInfo.FieldType 属性都返回 Type 对象,您可以在反射(reflection)。

object obj =... 
var field = obj.GetType().GetField(fieldName,...);
field.FieldType.GetField(...
//etc... etc...

对于每个字段,您可以查询类型,对于每个类型,您可以查询字段,并获取/设置它们。

顺便说一句,在 C# 4.0 中,您可以使用 dynamic 伪类型(它在声明动态变量时用作类型,但它不是真实类型),然后使用该变量,同时假设变量在运行时将具有的属性/字段/方法(即,像在编译时已知的那样使用它们,尽管它们不知道)。这对私有(private)成员不起作用(我不能足够警告你不要在反射中调用私有(private)成员),但对于公共(public)成员,这将使你的代码简单易读,就像你从未使用过反射一样(尽管在幕后[在这种情况下]将使用反射)。

关于C# - 使用反射设置属性的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22157768/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com