对于exvar o=(typeof(this))另一个对象,C#反射转换为实例类型 公共类SomeClass { 公共卫生服务 { var obj=Activator.CreateInstance(this.GetType()); //做事 返回(T)obj; } } 公共类DoStuff:SomeClass { } var ds=新的DoStuff(); ds.DoSomething();
这是可行的,但在这种情况下:对于exvar o=(typeof(this))另一个对象,C#反射转换为实例类型 公共类SomeClass { 公共卫生服务 { var obj=Activator.CreateInstance(this.GetType()); //做事 返回(T)obj; } } 公共类DoStuff:SomeClass { } var ds=新的DoStuff(); ds.DoSomething();,c#,generics,reflection,casting,abstract-class,C#,Generics,Reflection,Casting,Abstract Class,这是可行的,但在这种情况下: public class SomeClass<T> { public T DoSomething() { var obj = Activator.CreateInstance(this.GetType()); // Do Things return (T)obj; } } public class DoStuff : SomeClass<DoStuff> { } va
public class SomeClass<T>
{
public T DoSomething()
{
var obj = Activator.CreateInstance(this.GetType());
// Do Things
return (T)obj;
}
}
public class DoStuff : SomeClass<DoStuff>
{
}
var ds = new DoStuff();
ds.DoSomething();
公共抽象类AbstractStuff:SomeClass
{
}
公共类DoStuff:AbstractStuff
{
}
var ds=新的DoStuff();
ds.DoSomething();
给我一个错误,无法实例化一个抽象类,我理解,我想这样做:
public abstract class AbstractStuff : SomeClass<AbstractStuff>
{
}
public class DoStuff : AbstractStuff
{
}
var ds = new DoStuff();
ds.DoSomething();
public abstract class AbstractClass<T> where T : new()
{
public T DoSomething()
{
var obj = new T();
// Do Things
return obj;
}
}
public class DoStuff : AbstractClass<DoStuff>
{
}
var ds = new DoStuff();
ds.DoSomething();
公共类SomeClass
{
公共卫生服务
{
var obj=Activator.CreateInstance(this.GetType());
//做事
return(我不知道如何获得这种类型的铸件)obj;
}
}
我试着
返回(本)obj的类型
不管用,有什么想法吗?
塔克斯
抱歉:我忘了将AbstractStuff声明为abstract(已更正)这对我很有用
public class SomeClass<T>
{
public T DoSomething()
{
var obj = Activator.CreateInstance(this.GetType());
// Do Things
return (my not know how to get this casting type)obj;
}
}
因此,我们正在创建非抽象派生类的实例,而不是抽象基类。这对我很有用
public class SomeClass<T>
{
public T DoSomething()
{
var obj = Activator.CreateInstance(this.GetType());
// Do Things
return (my not know how to get this casting type)obj;
}
}
因此,我们正在创建非抽象派生类的实例,而不是抽象基类。您不能将变量强制转换为编译时未知的类型。考虑一下如何调用该方法:
public T DoSomething()
{
var obj = Activator.CreateInstance(typeof(T));
// Do Things
return (T)obj;
}
不能将变量强制转换为编译时未知的类型。考虑一下如何调用该方法:
public T DoSomething()
{
var obj = Activator.CreateInstance(typeof(T));
// Do Things
return (T)obj;
}
从你的问题来看这个例子
void Main()
{
DoStuff doStuff = new DoStuff();
DoStuff doStuff2 = doStuff.DoSomething();
}
public abstract class SomeClass<T>
where T : SomeClass<T>, new()
{
public T DoSomething()
{
return new T();
}
}
public class DoStuff : SomeClass<DoStuff>
{
}
现在,让我们重构一点以便于“调试”,并添加行号:
public AbstractStuff DoSomething()
{
var obj = Activator.CreateInstance(this.GetType());
// Do Things
return (AbstractStuff)obj;
}
如果在DoStuff
的实例上调用此方法,并在第4行中断,您将看到type
是DoStuff
;如果在第6行中断,您将看到obj
的运行时类型也是DoStuff
。当然,将该对象强制转换为AbstractStuff
将成功(甚至不需要强制转换),因为始终存在从任何引用类型到其基类型的隐式引用转换
现在让我们考虑一下你正在报告的错误消息:“不能实例化一个抽象类”。这告诉我们什么?它说,出于某种原因,当您调用Activator.CreateInstance时,您正在传递对类型
AbstractStuff
的引用
这使得您给我们的示例代码似乎不准确GetType()
永远不能返回抽象类型,因为对象的运行时类型永远不能是抽象类型。换句话说,不可能有抽象类型的实例
事实上,如果你有这句台词,你描述的行为是意料之中的
1 public AbstractStuff DoSomething()
2 {
3 var type = this.GetType();
4 var obj = Activator.CreateInstance(type);
5 // Do Things
6 return (AbstractStuff)obj;
7 }
…而不是
var obj = Activator.CreateInstance(typeof(T));
你确定不是这样吗?从你的问题中考虑这个例子
void Main()
{
DoStuff doStuff = new DoStuff();
DoStuff doStuff2 = doStuff.DoSomething();
}
public abstract class SomeClass<T>
where T : SomeClass<T>, new()
{
public T DoSomething()
{
return new T();
}
}
public class DoStuff : SomeClass<DoStuff>
{
}
现在,让我们重构一点以便于“调试”,并添加行号:
public AbstractStuff DoSomething()
{
var obj = Activator.CreateInstance(this.GetType());
// Do Things
return (AbstractStuff)obj;
}
如果在DoStuff
的实例上调用此方法,并在第4行中断,您将看到type
是DoStuff
;如果在第6行中断,您将看到obj
的运行时类型也是DoStuff
。当然,将该对象强制转换为AbstractStuff
将成功(甚至不需要强制转换),因为始终存在从任何引用类型到其基类型的隐式引用转换
现在让我们考虑一下你正在报告的错误消息:“不能实例化一个抽象类”。这告诉我们什么?它说,出于某种原因,当您调用Activator.CreateInstance时,您正在传递对类型
AbstractStuff
的引用
这使得您给我们的示例代码似乎不准确GetType()
永远不能返回抽象类型,因为对象的运行时类型永远不能是抽象类型。换句话说,不可能有抽象类型的实例
事实上,如果你有这句台词,你描述的行为是意料之中的
1 public AbstractStuff DoSomething()
2 {
3 var type = this.GetType();
4 var obj = Activator.CreateInstance(type);
5 // Do Things
6 return (AbstractStuff)obj;
7 }
…而不是
var obj = Activator.CreateInstance(typeof(T));
你确定不是这样吗?是不是CreateInstance失败了?不,CreateInstance正在工作,返回类型必须是(不是)çabstract,DoStuff不是abstract,但t tyoe是AbstractStuffm,我需要转换为这种类型,thanxI刚刚成功运行了发布的代码。你确定这就是你要尝试的吗?你的两个场景对我都有效-你确定你在做测试时完全公开了你使用的代码吗?-我完全不清楚你要做什么。请再写一次问题。失败的不是CreateInstance吗?不,CreateInstance正在工作,返回类型必须是(非)çabstract,DoStuff不是abstract,但t tyoe是AbstractStuffm,我需要转换为这种类型,thanxI刚刚成功运行了发布的代码。你确定这就是你要尝试的吗?你的两个场景对我都有效-你确定你在做测试时完全公开了你使用的代码吗?-我完全不清楚你要做什么。请再写一次问题。你是对的,我遗漏了一些东西,接下来几天我会发布问题的完整代码,谢谢。你是对的,我遗漏了一些东西,接下来几天我会发布问题的完整代码,谢谢。