我不熟悉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
,因此它更复杂,但是现在我很乐意掌握这个概念。
由于
尔根
答案 0 :(得分:3)
当然,这不会起作用,因为你将类型与类型的值(或实例)混合在一起。
您可能需要考虑的是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 :(得分: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