C# 访问传递到泛型类的泛型对象

C# 访问传递到泛型类的泛型对象,c#,generics,reflection,orleans,C#,Generics,Reflection,Orleans,我试图使用泛型类传入数据对象,然后使用其中的值来完成CRUD操作 class OrderState<TGrainState> : Grain, IState where TGrainState : class { protected TGrainState State { get; set; } public Task Get() { using (var context = new SDbContext()) {

我试图使用泛型类传入数据对象,然后使用其中的值来完成CRUD操作

class OrderState<TGrainState> : Grain, IState where TGrainState : class
{
    protected TGrainState State { get; set; }

    public Task Get()
    {
        using (var context = new SDbContext())
        {
            //Passing Null instance because not sure how to access the instance of the state object
            var test = typeof(TGrainState).GetProperty("id").GetValue(null);

            //int t = (int)test;
            //var obj = context.orders.Where(x => x.Id == t);
            //return Task.FromResult(obj);
        }


        return Task.CompletedTask;
    }
}
这是我试图传递到泛型类中的state类

class OrderGrain : OrderState<State>, IOrder
{
    public override Task OnActivateAsync()
    {
        //Should fill the State Object from the Db
        Get();
        //Sets the information contained in the State to the Object
        this.orderInfo = new OrderInfo
        {
            Id = State.Id,
            Created = State.Created,
            AssignedOrganization = State.AssignedOrganization,
            isComplete = State.isComplete,
            assignedUser = State.assignedUser
        };
        return base.OnActivateAsync();
    }
}
类OrderGrain:OrderState,IOrder { ActivateAsync()上的公共覆盖任务 { //应该从数据库中填充状态对象 Get(); //将状态中包含的信息设置为对象 this.orderInfo=新的orderInfo { Id=State.Id, Created=State.Created, AssignedOrganization=State.AssignedOrganization, isComplete=State.isComplete, assignedUser=State.assignedUser }; 返回base.OnActivateAsync(); } } 从包含所有CRUD操作的状态泛型类继承的类

因此,我或多或少要完成的是Microsoft Orleans的状态设置,您可以创建一个状态对象,对其进行操作,然后调用Write()、Update()、Delete()或Get(),使用声明的状态数据在数据库实体框架上执行CRUD操作

问题是,当我试图访问泛型类(OrderState)中State对象(State)属性的值时,我得到了错误

System.Reflection.TargetException:“非静态方法需要 目标。”

链接到我试图模仿的奥尔良信息。


我可能认为这是错误的或完全错误的,因此非常感谢您的帮助。

我将假设这是一个简单的大小写不匹配的案例(双关语并非有意)

在这方面:

var test = typeof(TGrainState).GetProperty("id").GetValue(null);
您正在查找属性
id
。但是,您的类是这样声明的:

public int Id { get; set; }

GetProperty方法的返回值是“一个表示具有指定名称的公共属性的对象,如果找到;否则,null”在null实例上调用GetValue将导致您看到的异常。

这里的问题是什么?通过“访问值”更新了我假设的问题你是说调用getter。如果要调用实例方法/getter/setter/which,则需要一个实例来调用它。您正在传递“null”。这适用于静态方法/getter/setter,但不适用于实例方法。你的代码不容易告诉你想做什么。但你想知道谁的身份get@Flydog57是的,这就是我面临的问题。在MicrosoftProjectOrleans中,您创建了一个类,该类扩展了为持久化状态传递状态对象的通用粒度类。然后更新类中的信息,并调用泛型grain类中的WriteStateAsync等方法,该方法使用State对象执行对DB的写入。这就是我想要复制的。我明白你的意思,这是有道理的,但是我该如何获取实例呢?因为它不是在OrderState类中真正实例化的,所以实例将在OrderGrain类中。你的其余代码没有任何意义。您的“State”类有一大堆非静态属性,但您的代码是:Id=State.Id。这不能编译,是吗?你需要有一个TGrainState的实例挂在某个地方,这样任何一个都可以工作。请不要发布“不编译”代码,除非你说“这不编译”。一旦你得到了这个,那么就有了一个TGrainState实例,你可以将它约束到一个具有ID属性的接口上,然后不需要反射就可以进城。你可以使用
Activator.CreateInstance(typeof(TGrainState))
创建你的实例,然后将该实例传递给
GetValue
。看见如果将
new()
泛型约束添加到
TGrainState
中,则也可以使用
new TGrainState()
创建实例。然后用
.GetValue(this.State)
调用GetValue。
public int Id { get; set; }