访问传递给泛型类的泛型对象

时间:2018-07-10 18:15:55

标签: 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())
        {
            //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;
    }
}

TGrainState是我想要传递的通用对象。

public class State
{
    public int Id { get; set; }
    public DateTime Created { get; set; }
    public string AssignedOrganization { get; set; }
    public bool isComplete { get; set; }
    public string assignedUser { get; set; }
}

这是我试图传递给泛型类的状态类。

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();
    }
}

从包含所有CRUD操作的State Generic类继承的类。

所以我或多或少试图完成的工作就是Microsoft Orleans如何进行状态设置,在该状态创建状态对象,对其进行操作,然后调用Write(),Update(),Delete()或Get() )使用声明的状态数据在带有实体框架的数据库上执行CRUD操作。

问题是,当我尝试访问通用类(OrderState)内的State对象(State)的属性的值时,出现错误

  

System.Reflection.TargetException:'非静态方法需要一个   目标。

链接到我试图模仿的奥尔良信息。 Microsoft Orleans Grain Persistence

我可能会考虑这个错误或完全错误,因此任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

我将假定这是一个大小写不匹配的简单情况(双关语不是故意的)。

在这一行:

<tr ng-repeat = "favourites in items.Likes">  
       <td>{{ favourites }}</td>  
       <td ng-if="$index <= items.Dislikes.length-1">{{items.Dislikes[$index]}}</td>


</tr>  

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

id

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