-3

我需要将对象转换为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 的值。

4

3 回答 3

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))); 
于 2012-11-28T18:52:11.220 回答
1

只有两种方法可以在编译时不知道其类型的情况下访问某物的属性/方法。你肯定处于这种情况:

  • 反射——很快就变得相当麻烦,即使是基本的事情,但可以让你做几乎任何你想做的事情。
  • 动态的——使 C# 的行为类似于动态类型语言,但不允许您执行诸如访问名称也是动态的属性之类的事情。

由于在您的情况下,属性名称也是动态的,所以我会说答案是否定的,没有更好的方法来操作在编译时不知道的对象和属性。

您最好以这样一种方式设计您的体系结构,以避免以非常动态的方式访问对象,但是由于上下文太少而无法推荐特定的方法。

于 2012-11-28T18:41:22.830 回答
0

你试图做的事情没有意义。

  • 此行:Type multiplicityAttribute = myDll.GetExportedTypes().FirstOrDefault(..);动态获取您尝试绑定的类型。
  • 然后你试图反对它:(multiplicityAttribute)ca)

投完之后你会怎么做?

你是:

  • 试图获取属性名称?
  • 试图获取具有某些属性的对象类型列表?
  • 试图获取某个静态属性的值?
  • 试图获取某个实例属性的值,但您不知道定义该实例的类的名称?

看起来您正在尝试做的是创建一种可通用的方法来检查实际上非常具体的事物。使用反射时,通常更容易转向另一个方向:首先解决特定情况,然后重构为更通用的方法。

于 2012-11-28T18:48:14.977 回答