将类型转换为PropertyType

时间:2011-11-10 17:04:36

标签: c# reflection properties

我不熟悉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 个答案:

答案 0 :(得分:3)

当然,这不会起作用,因为你将类型与类型的值(或实例)混合在一起。

您可能需要考虑的是PropertyInfo.GetValuePropertyInfo.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 :(得分:1)

您不需要反射来设置属性Time的类型。它被定义为DateTime的一种类型。我不确定这是反思的问题。

同样在GetSomeType方法中,您不需要实例化对象来检索其类型。

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

  return null;
}

答案 2 :(得分:1)

可能对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;
    }
}

这对你有用。但我不知道你为什么要这样做。

答案 3 :(得分:1)

首先,而不是:

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

你可以这样做:

return typeof(DateTime);

另外,你不需要施放if(只是猜测)你通过PropertyInfo设置一个属性:

propInfo.SetValue(instance, value, null);

其中变量值可以是object类型,只有运行时类型必须匹配,您也可以像这样检查:

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

不过,我想知道你要做什么。

答案 4 :(得分:0)

您需要将实现更改为使用对象返回类型而不是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