Как преобразовать объект не-ссылочного типа в реальный объект - PullRequest
2 голосов
/ 09 июня 2011

Может быть, этот вопрос вас смущает, но, пожалуйста, помогите мне

В .NET 4.0, язык C #

У меня есть два проекта, один - это классы определения библиотеки и информация об атрибутах для класса, другой - проект, который обрабатывает отражение класса, объявленного из этой библиотеки.

Проблема в том, что без ссылки на библиотеку я просто использую классы, связанные с отражением, для чтения сборки, и мне нужно получить значение свойств, объявленных в классе объекта.

Например

--- В проекте LIB с именем lib.dll

public class MarkAttribute: Attribute
{
    public string A{get;set;}
    public string B{get;set;}
}

[Mark(A="Hello" B="World")]
public class Data
{
}

--- В проекте Reflection

public void DoIt()
{
   string TypeName="Lib.Data";
   var asm=Assembly.LoadFrom("lib.dll");
   foreach (var x in asm.GetTypes())
   {
      if (x.GetType().Name=="Data")
      {
        var obj=x.GetType().GetCustomAttributes(false);

        //now if i make reference to lib.dll in the usual way , it is ok
        var mark=(Lib.MarkAttribute)obj;
        var a=obj.A ; 
        var b=obj.B ;

       //but if i do not make that ref
       //how can i get  A,B value
      }
   }
}

Любая идея приветствуется

Ответы [ 5 ]

3 голосов
/ 09 июня 2011

Если вы знаете имена свойств, вы можете использовать dynamic вместо отражения:

 dynamic mark = obj;
 var a = obj.A; 
 var b = obj.B;
2 голосов
/ 09 июня 2011

Вы также можете получить свойства атрибута, используя отражение:

Assembly assembly = Assembly.LoadFrom("lib.dll");
Type attributeType = assembly.GetType("Lib.MarkAttribute");
Type dataType = assembly.GetType("Lib.Data");
Attribute attribute = Attribute.GetCustomAttribute(dataType, attributeType);
if( attribute != null )
{
    string a = (string)attributeType.GetProperty("A").GetValue(attribute, null);
    string b = (string)attributeType.GetProperty("B").GetValue(attribute, null);
    // Do something with A and B
}
2 голосов
/ 09 июня 2011

Вы можете вызвать получателя собственности:

var attributeType = obj.GetType();
var propertyA = attributeType.GetProperty("A");
object valueA = propertyA.GetGetMethod().Invoke(obj, null)
1 голос
/ 09 июня 2011

Вам нужно удалить многие из вызовов GetTypes(), так как у вас уже есть объект Type.Затем вы можете использовать GetProperty для извлечения свойства пользовательского атрибута.

foreach (var x in asm.GetTypes())
{
   if (x.Name=="Data")
   {
       var attr = x.GetCustomAttributes(false)[0]; // if you know that the type has only 1 attribute
       var a = attr.GetType().GetProperty("A").GetValue(attr, null);
       var b = attr.GetType().GetProperty("B").GetValue(attr, null);
    }
}
0 голосов
/ 09 июня 2011
var assembly = Assembly.Load("lib.dll");
dynamic obj = assembly.GetType("Lib.Data").GetCustomAttributes(false)[0];
var a = obj.A;
var b = obj.B;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...