C# 访问传递到泛型类的泛型对象
我试图使用泛型类传入数据对象,然后使用其中的值来完成CRUD操作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()) {
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; }