在linq中将对象转换为System.Type

时间:2012-11-28 18:25:15

标签: c# .net linq .net-4.0

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

3 个答案:

答案 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)

在编译时不知道其类型,只有两种方法可以访问某些属性/方法。你当然是在这种情况下:

  • 反思 - 即使是基本的东西,也会很快变得相当繁琐,但是你可以做任何你想要的事情。
  • 动态 - 使C#的行为与动态类型语言类似,但不允许您访问名称也是动态的属性。

因为在你的情况下属性名称也是动态的,我会说答案是没有,没有更好的方法来处理在编译时不知道的对象和属性。

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

答案 2 :(得分:0)

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

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

一旦你演出,你打算做什么?

你是:

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

您尝试做的似乎是创建一种通用的方法来检查实际上非常具体的内容。使用Reflection时,通常更容易走另一个方向:首先解决特定情况,然后重构为更通用的方法。