对于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刚刚成功运行了发布的代码。你确定这就是你要尝试的吗?你的两个场景对我都有效-你确定你在做测试时完全公开了你使用的代码吗?-我完全不清楚你要做什么。请再写一次问题。你是对的,我遗漏了一些东西,接下来几天我会发布问题的完整代码,谢谢。你是对的,我遗漏了一些东西,接下来几天我会发布问题的完整代码,谢谢。