访问通用对象参数

本文关键字:参数 对象 访问 | 更新日期: 2023-09-27 18:33:06

请考虑以下代码片段:

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
    }
}

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

还有别的办法吗?

更新:

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

更新 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

并把它放在方法里面。

访问通用对象参数

喜欢void Log(T entity)并在方法中使用它。

好吧,就这样做:

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

关于你的其他陈述:

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

T本身没有实例。你可以得到Type对象,用typeof(T)表示T

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

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

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