Тип приведения к PropertyType - PullRequest
       11

Тип приведения к PropertyType

0 голосов
/ 10 ноября 2011

Я новичок в отражении в C # и имею что-то похожее на это:

class A
{
    DateTime _time = DateTime.Now;
    public DateTime Time
    {
       set
       {
          _time = value;
       }
       get
       {
          return _time;
       }
    }
}

И этот метод где-то в приложении:

public Type GetSomeType(int num)
{
    switch (num)
    {
        case 0:
            DateTime time = DateTime.Now;
            return time.GetType();
        case 1:
            int i = 5;
            return i.GetType();
        default:
            return null;
    }
}

Я пытаюсь установить свойство Time класса A с результатом метода GetSomeType:

A MyClass = new A();
MyClass.Time = (DateTime)GetSomeType(0); //Clearly, this does not work

Я не знаю, возможно ли это вообще или я совершенно не прав? В моем реальном приложении это более сложно, так как я работаю с PropertyInfo, но сейчас я был бы счастлив понять концепцию.

Спасибо

Юрген

Ответы [ 5 ]

3 голосов
/ 10 ноября 2011

Естественно, это не сработает, потому что вы смешиваете типы со значением (или экземплярами) типов.

Вам, вероятно, понадобится изучить PropertyInfo.GetValue (PropertyInfo.SetValue может быть таким же актуальным, в зависимости от того, что вы хотите делать дальше, тоже) - но я думаю, что вам, возможно, придется подумать, что именно вы хотите делать;в вашем примере, например, вы можете просто вернуть объект или, возможно, динамический, поскольку вы создаете экземпляр и обрабатываете значение напрямую.Но звучит так, будто вы хотите получить значение существующего экземпляра чего-либо.

Скажем, если у вас есть A и B, вы хотите получить значение B.a и установить A.a с этим не понятно из вашего объяснения, почему вы не можете просто сделать B.a = A.a или для чего предназначен дискриминатор num;но если вы действительно должны использовать отражение , а уже имеют PropertyInfo, то:

public dynamic GetSomeValue(object instance, PropertyInfo property)
{
    return property.GetValue(instance, null);
}

Хотя это далеко не идеально, ив большинстве случаев ущербен, если не излишним - надеюсь, будет достаточно информации, которая позволит вам объединить то, что вы можете сделать с тем, что вам нужно сделать.

1 голос
/ 10 ноября 2011

Во-первых, вместо этого:

DateTime time = DateTime.Now;
return time.GetType();

вы можете сделать это:

return typeof(DateTime);

также вам не нужно разыгрывать, если (просто догадываясь) вы устанавливаете свойствочерез PropertyInfo:

propInfo.SetValue(instance, value, null);

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

if (value == null || propInfo.PropertyType == value.GetType())  

Тем не менее, ямне интересно, что вы пытаетесь сделать.

1 голос
/ 10 ноября 2011

Вероятно, существует некоторое недопонимание того, что представляет Type.Он представляет только объект типа, ничего больше.Ваш код может быть упрощен до следующего, и он будет вести себя точно так же:

public Type GetSomeType(int num)
{
    switch (num)
    {
        case 0:
            return typeof(DateTime);
        case 1:
            return typeof(int);
        default:
            return null;
    }
}

Я предполагаю, что вы хотите вернуть object или что-то в этом роде:

public object GetSomeType(int num)
{
    switch (num)
    {
        case 0:
            return DateTime.Now;
        case 1:
            return 5;
        default:
            return null;
    }
}

Это должно работать для вас.Но я понятия не имею, зачем ты это делаешь.

1 голос
/ 10 ноября 2011

Вам не нужно отражение, чтобы установить тип свойства Time. это определяется как тип DateTime. Я не уверен, что это проблема для размышлений.

Также в методе GetSomeType вам не нужно создавать экземпляры объектов для получения их типа.

public Type GetType(int num)
{
  switch(num)
  {
     case 0:
       return typeof(DateTime);
     case 1:
       return typeof(int)
   }

  return null;
}
0 голосов
/ 10 ноября 2011

Вам нужно будет изменить свою реализацию, чтобы использовать тип возвращаемого объекта вместо Type в качестве возвращаемого типа, а также вы должны будете использовать обнуляемый тип datetime. Ниже приведен пример кода:

class A
{
    DateTime? _time = DateTime.Now;
    public DateTime? Time
    {
       set
       {
          _time = value;
       }
       get
       {
          return _time;
       }
    }
}


public object GetSomeType(int num)
{
    switch (num)
    {
        case 0:
            DateTime time = DateTime.Now;
            return time;
        case 1:
            int i = 5;
            return i;
        default:
            return null;
    }
}

A MyClass = new A();
MyClass.Time = this.GetSomeType(0) as DateTime?; //This should now work
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...