我需要将一个对象强制转换为System.Type
对象。
我已经读过C#是静态类型的,所以这是不可能的。
这是真的吗?
如果是,我该如何做到这一点?
Assembly myDll = Assembly.LoadFrom(dllData.Path);
Type manyAttribute = myDll.GetExportedTypes().FirstOrDefault(...);
Type multiplicityAttribute = myDll.GetExportedTypes().FirstOrDefault(..);
//Here is the problem
propertiesOnOtherFile = propertiesOnOtherFile.Where(t =>
t.GetCustomAttributes(false).Any(ca =>
!string.IsNullOrEmpty(((multiplicityAttribute)ca).PropertyName)));
这是一行:
((multiplicityAttribute)ca).PropertyName)
还有其他办法吗?
编辑:
由于许多问题,这是我的范围:
public class PocoClass
{
[ManyAttribute]
public ObjectX MyProp;
}
ManyAttribute declaration
{
public string PropertyName;
}
ManyAttribute位于动态加载的DLL中。 然后,如上面的示例所示,我需要将customAttribute(ManyAttribute)强制转换为ManyAttribute,以便检查PropertyName的值。
答案 0 :(得分:2)
我仍然没有得到这个...但这应该有用。
IEnumerable<Type> propertiesOnOtherFile = new List<Type>(); //from somewhere?
//Here is the problem
propertiesOnOtherFile = propertiesOnOtherFile.Where(t =>
t.GetCustomAttributes(false).Any<dynamic>(ca =>
!string.IsNullOrEmpty(ca.PropertyName)));
答案 1 :(得分:1)
在编译时不知道其类型,只有两种方法可以访问某些属性/方法。你当然是在这种情况下:
因为在你的情况下属性名称也是动态的,我会说答案是没有,没有更好的方法来处理在编译时不知道的对象和属性。
您应该以这样一种方式设计您的体系结构,以避免以非常动态的方式访问对象,但是推荐特定方法的上下文太少。
答案 2 :(得分:0)
你试图做的事情没有意义。
Type multiplicityAttribute = myDll.GetExportedTypes().FirstOrDefault(..);
获取您尝试动态绑定的Type。(multiplicityAttribute)ca)
一旦你演出,你打算做什么?
你是:
您尝试做的似乎是创建一种通用的方法来检查实际上非常具体的内容。使用Reflection时,通常更容易走另一个方向:首先解决特定情况,然后重构为更通用的方法。