访问通用对象参数

时间:2014-12-03 10:58:14

标签: c# asp.net asp.net-mvc generics

请考虑以下代码段:

public class FooRepository<T> : BaseRepository<T>
    where T : EntityBase
{
    public FooRepository(ISessionFactory sessionFactory)
        : base(sessionFactory)
    {
        this.AfterWriteOperation += (sender, local) => this.Log();
    }

    public void Log()
    {
        // I want to access T here
    }
}

我想访问T函数中的Log(),但问题是我无法更改构造函数签名,例如:FooRepository(ISessionFactory sessionFactory, T entity)。我不知道如何将其传递到Log()

还有其他办法吗?

更新

我想访问T内的Log()实例。

更新2

嗯,抱歉这个烂摊子。我不习惯所有这些东西。我会在这里澄清一些事情。所以我的存储库在服务层调用:

BarRepository.Update(entityToPersist); // Bar inherits from Foo

Update方法中,调用事件AfterWriteOperation

if (AfterWriteOperation != null)
    AfterWriteOperation(this, e);

对于所有这些事情,我只是放弃了上述案例中e是我的实体的简单事实,所以我可以通过这种方式将其传递给Log:

(sender, local) => this.Log(local); // I will rename local to entity

将其放入方法中。

2 个答案:

答案 0 :(得分:4)

  

void Log(T entity)类似,并在方法中使用它。

Well just do that

using System;

namespace Works4Me
{
    public interface ISessionFactory { }
    public class EntityBase { }
    public class BaseRepository<T> where T : EntityBase { }

    public class FooRepository<T> : BaseRepository<T>
        where T : EntityBase
    {
        public FooRepository(ISessionFactory sessionFactory)
        {
        }

        public void Log(T entity)
        {
        }
    }

    public class Test
    {
        public static void Main()
        {
        // your code goes here
        }
    }
}
  

成功#stdin #stdout 0.01s 33480KB

关于你的其他陈述:

  

我想访问T内的Log()实例。

T本身没有实例。您可以使用Type代表T typeof(T)对象。

答案 1 :(得分:1)

如果您想获得有关此类型的信息,例如在NameMethodsInterfaces...typeof(T然后使用log) - 就像.GetType()对实例的调用一样并将返回泛型参数的类型。 如果您想使用该类型的任何实例,则必须

a)创建实例(Activator.CreateInstance(typeof(T)))

b)通过构造函数传递实例,然后传递给this.Log(passedInstance)调用。